File: N:\mfix\model\check_data\check_bc_geometry.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     ! Subroutine: CHECK_BC_GEOMETRY                                        !
4     ! Author: J.Musser                                    Date: 01-Mar-14  !
5     !                                                                      !
6     ! Purpose: Determine if BCs are "DEFINED" and that they contain the    !
7     ! minimum amount of geometry data.                                     !
8     !                                                                      !
9     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
10           SUBROUTINE CHECK_BC_GEOMETRY
11     
12     ! Global Variables:
13     !---------------------------------------------------------------------//
14     ! Flag: BC contains geometric data and/or specified type
15           use bc, only: BC_DEFINED
16     ! User specified BC
17           use bc
18     ! User specified: BC geometry
19           use bc, only: BC_X_e, BC_X_w, BC_I_e, BC_I_w
20           use bc, only: BC_Y_n, BC_Y_s, BC_J_n, BC_J_s
21           use bc, only: BC_Z_t, BC_Z_b, BC_K_t, BC_K_b
22     ! User specified: System geometry
23           use geometry, only: NO_I, XLENGTH
24           use geometry, only: NO_J, YLENGTH
25           use geometry, only: NO_K, ZLENGTH
26     ! Flag: Reinitializing field conditions.
27           use run, only: REINITIALIZING
28     
29     ! Global Parameters:
30     !---------------------------------------------------------------------//
31     ! The max number of BCs.
32           use param, only: DIMENSION_BC
33     ! Parameter constants
34           use param1, only: ZERO, UNDEFINED, UNDEFINED_I, UNDEFINED_C
35     
36     ! Use the error manager for posting error messages.
37     !---------------------------------------------------------------------//
38           use error_manager
39     
40     
41           IMPLICIT NONE
42     
43     
44     ! Local Variables:
45     !---------------------------------------------------------------------//
46     ! loop/variable indices
47           INTEGER :: BCV, I
48     ! Error flag
49           LOGICAL :: RECOGNIZED_BC_TYPE
50     !......................................................................!
51     
52     ! Skip this routine if reinitializing as BC locations cannot be changed.
53           IF(REINITIALIZING) RETURN
54     
55           CALL INIT_ERR_MSG("CHECK_BC_GEOMETRY")
56     
57           BC_TYPE_ENUM = BLANK
58     
59           L50: DO BCV = 1, DIMENSION_BC
60     
61              BC_DEFINED(BCV) = .FALSE.
62              IF(BC_X_W(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
63              IF(BC_X_E(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
64              IF(BC_Y_S(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
65              IF(BC_Y_N(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
66              IF(BC_Z_B(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
67              IF(BC_Z_T(BCV) /= UNDEFINED)   BC_DEFINED(BCV) = .TRUE.
68              IF(BC_I_W(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
69              IF(BC_I_E(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
70              IF(BC_J_S(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
71              IF(BC_J_N(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
72              IF(BC_K_B(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
73              IF(BC_K_T(BCV) /= UNDEFINED_I) BC_DEFINED(BCV) = .TRUE.
74              IF(BC_TYPE(BCV) == 'CG_NSW')   BC_DEFINED(BCV) = .TRUE.
75              IF(BC_TYPE(BCV) == 'CG_FSW')   BC_DEFINED(BCV) = .TRUE.
76              IF(BC_TYPE(BCV) == 'CG_PSW')   BC_DEFINED(BCV) = .TRUE.
77              IF(BC_TYPE(BCV) == 'CG_MI')    BC_DEFINED(BCV) = .TRUE.
78              IF(BC_TYPE(BCV) == 'CG_PO')    BC_DEFINED(BCV) = .TRUE.
79     
80              IF (BC_TYPE(BCV) == 'DUMMY') BC_DEFINED(BCV) = .FALSE.
81     
82              IF(BC_TYPE(BCV)/=UNDEFINED_C .AND. BC_TYPE(BCV)/='DUMMY')THEN
83     
84                 RECOGNIZED_BC_TYPE = .FALSE.
85                 DO I = 1, DIM_BCTYPE
86                     VALID_BC_TYPE(I) = TRIM(VALID_BC_TYPE(I))
87                     IF(VALID_BC_TYPE(I) == trim(BC_TYPE(BCV))) THEN
88                        BC_TYPE_ENUM(BCV) = VALID_BC_TYPE_ENUM(I)
89                        RECOGNIZED_BC_TYPE = .TRUE.
90                        EXIT
91                     ENDIF
92                 ENDDO
93     
94                 IF(.NOT.RECOGNIZED_BC_TYPE) THEN
95                    WRITE(ERR_MSG, 1100) trim(iVar('BC_TYPE',BCV)), &
96                       BC_TYPE_ENUM(BCV), VALID_BC_TYPE
97                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
98                 ENDIF
99              ENDIF
100     
101              IF(.NOT.BC_DEFINED(BCV)) CYCLE
102              IF(IS_CG(BC_TYPE_ENUM(BCV))) CYCLE
103     
104              IF(BC_X_W(BCV)==UNDEFINED .AND. BC_I_W(BCV)==UNDEFINED_I) THEN
105                 IF(NO_I) THEN
106                    BC_X_W(BCV) = ZERO
107                 ELSE
108                    WRITE(ERR_MSG,1101) BCV, 'BC_X_w and BC_I_w'
109                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
110                 ENDIF
111              ENDIF
112     
113              IF(BC_X_E(BCV)==UNDEFINED .AND. BC_I_E(BCV)==UNDEFINED_I) THEN
114                 IF(NO_I) THEN
115                    BC_X_E(BCV) = XLENGTH
116                 ELSE
117                    WRITE(ERR_MSG, 1101) BCV, 'BC_X_e and BC_I_e'
118                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
119                 ENDIF
120              ENDIF
121     
122              IF(BC_Y_S(BCV)==UNDEFINED .AND. BC_J_S(BCV)==UNDEFINED_I) THEN
123                 IF(NO_J) THEN
124                    BC_Y_S(BCV) = ZERO
125                 ELSE
126                    WRITE(ERR_MSG, 1101) BCV, 'BC_Y_s and BC_J_s'
127                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
128                 ENDIF
129              ENDIF
130     
131              IF(BC_Y_N(BCV)==UNDEFINED .AND. BC_J_N(BCV)==UNDEFINED_I) THEN
132                 IF(NO_J) THEN
133                    BC_Y_N(BCV) = YLENGTH
134                 ELSE
135                    WRITE(ERR_MSG, 1101) BCV, 'BC_Y_n and BC_J_n'
136                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
137                 ENDIF
138              ENDIF
139     
140              IF(BC_Z_B(BCV)==UNDEFINED .AND. BC_K_B(BCV)==UNDEFINED_I) THEN
141                 IF(NO_K) THEN
142                    BC_Z_B(BCV) = ZERO
143                 ELSE
144                    WRITE(ERR_MSG, 1101) BCV, 'BC_Z_b and BC_K_b'
145                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
146                 ENDIF
147              ENDIF
148     
149              IF(BC_Z_T(BCV)==UNDEFINED .AND. BC_K_T(BCV)==UNDEFINED_I) THEN
150                 IF(NO_K) THEN
151                    BC_Z_T(BCV) = ZLENGTH
152                 ELSE
153                    WRITE(ERR_MSG, 1101) BCV, 'BC_Z_t and BC_K_t'
154                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
155                 ENDIF
156              ENDIF
157     
158      1101 FORMAT('Error 1101: Boundary condition ',I3,' is ill-defined.',/ &
159              A,' are not specified.',/'Please correct the mfix.dat file.')
160     
161     ! Swap BC aliases for the "full name" complement.
162              DO I = 1, DIM_BCTYPE
163                 VALID_BC_TYPE(I) = TRIM(VALID_BC_TYPE(I))
164                 IF(VALID_BC_TYPE(I) == BC_TYPE(BCV)) THEN
165                    IF(MOD(I,2) == 0) THEN
166                       BC_TYPE_ENUM(BCV) = VALID_BC_TYPE_ENUM(I-1)
167                    ELSE
168                       BC_TYPE_ENUM(BCV) = VALID_BC_TYPE_ENUM(I)
169                    ENDIF
170                    CYCLE  L50
171                 ENDIF
172              ENDDO
173     
174              WRITE(ERR_MSG, 1100) trim(iVar('BC_TYPE',BCV)),               &
175                 BC_TYPE_ENUM(BCV), VALID_BC_TYPE
176              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
177     
178           ENDDO L50   ! end loop over (bcv=1,dimension_bc)
179     
180           CALL FINL_ERR_MSG
181     
182           RETURN
183     
184     
185      1100 FORMAT('Error 1100: Illegal entry: ',A,' = ',A,/'Valid entries:',&
186              ' ',10(/5X,A,2x,A),/5X,A)
187     
188           END SUBROUTINE CHECK_BC_GEOMETRY
189     
190     
191     
192     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
193     !                                                                      !
194     !  Subroutine: CHECK_BC_GEOMETRY_WALL                                  !
195     !  Author: P. Nicoletti                               Date: 10-DEC-91  !
196     !                                                                      !
197     !  Purpose: Find and validate i, j, k locations for walls BC's         !
198     !                                                                      !
199     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
200           SUBROUTINE CHECK_BC_GEOMETRY_WALL(BCV)
201     
202     ! Global Variables:
203     !---------------------------------------------------------------------//
204     ! Boundary condition locations and corresponding grid index
205           use bc, only: BC_X_w, BC_X_e, BC_I_w, BC_I_e
206           use bc, only: BC_Y_s, BC_Y_n, BC_J_s, BC_J_n
207           use bc, only: BC_Z_b, BC_Z_t, BC_K_b, BC_K_t
208     ! Basic grid information
209           use geometry, only: NO_I, XLENGTH, DX, IMAX, IMAX2, XMIN
210           use geometry, only: NO_J, YLENGTH, DY, JMAX, JMAX2
211           use geometry, only: NO_K, ZLENGTH, DZ, KMAX, KMAX2
212     ! Flag: Reinitializing field conditions.
213           use run, only: REINITIALIZING
214     ! Function to compare two values
215           use toleranc, only: COMPARE
216     
217     ! Global Parameters:
218     !---------------------------------------------------------------------//
219           use param1, only: ZERO, UNDEFINED_I, UNDEFINED
220     
221     ! Use the error manager for posting error messages.
222     !---------------------------------------------------------------------//
223           use error_manager
224     
225     
226           IMPLICIT NONE
227     
228     
229     ! Dummy Arguments:
230     !---------------------------------------------------------------------//
231     ! Index of boundary condition.
232           INTEGER, INTENT(in) :: BCV
233     
234     ! Local Variables:
235     !---------------------------------------------------------------------//
236     ! Calculated indices of the wall boundary
237           INTEGER :: I_w , I_e , J_s , J_n , K_b , K_t
238     ! Integer error flag
239           INTEGER :: IER
240     !......................................................................!
241     
242     
243     ! Skip this routine if reinitializing as BC locations cannot be changed.
244           IF(REINITIALIZING) RETURN
245     
246           CALL INIT_ERR_MSG("CHECK_BC_GEOMETRY_WALL")
247     
248           IF(BC_X_W(BCV)/=UNDEFINED .AND. BC_X_E(BCV)/=UNDEFINED) THEN
249     
250     ! setting indices to 1 if there is no variation in the i (x) direction
251              IF (NO_I) THEN
252                 I_W = 1
253                 I_E = 1
254              ELSE
255                 CALL CALC_CELL (XMIN, BC_X_W(BCV), DX, IMAX, I_W)
256                 I_W = I_W + 1
257                 CALL CALC_CELL (XMIN, BC_X_E(BCV), DX, IMAX, I_E)
258     ! BC along zy plane, checking if far west or far east of domain
259                 IF(BC_X_W(BCV) == BC_X_E(BCV)) THEN
260                    IF(COMPARE(BC_X_W(BCV),XMIN)) THEN
261                       I_W = 1
262                       I_E = 1
263                    ELSEIF(COMPARE(BC_X_W(BCV),XMIN+XLENGTH)) THEN
264                       I_W = IMAX2
265                       I_E = IMAX2
266                    ENDIF
267                 ENDIF
268              ENDIF
269     
270     ! checking/setting corresponding i indices according to specified x
271     ! coordinates
272              IF(BC_I_W(BCV)/=UNDEFINED_I .OR. BC_I_E(BCV)/=UNDEFINED_I) THEN
273                 CALL LOCATION_CHECK (BC_I_W(BCV), I_W, BCV, 'BC - west')
274                 CALL LOCATION_CHECK (BC_I_E(BCV), I_E, BCV, 'BC - east')
275              ELSE
276                 BC_I_W(BCV) = I_W
277                 BC_I_E(BCV) = I_E
278              ENDIF
279           ENDIF
280     
281     
282           IF(BC_Y_S(BCV)/=UNDEFINED .AND. BC_Y_N(BCV)/=UNDEFINED) THEN
283     ! setting indices to 1 if there is no variation in the j (y) direction
284              IF(NO_J) THEN
285                 J_S = 1
286                 J_N = 1
287              ELSE
288                 CALL CALC_CELL (ZERO, BC_Y_S(BCV), DY, JMAX, J_S)
289                 J_S = J_S + 1
290                 CALL CALC_CELL (ZERO, BC_Y_N(BCV), DY, JMAX, J_N)
291     ! BC along xz plane, checking if far south or far north of domain
292                 IF(BC_Y_S(BCV) == BC_Y_N(BCV)) THEN
293                    IF(COMPARE(BC_Y_S(BCV),ZERO)) THEN
294                       J_S = 1
295                       J_N = 1
296                    ELSE IF (COMPARE(BC_Y_S(BCV),YLENGTH)) THEN
297                       J_S = JMAX2
298                       J_N = JMAX2
299                    ENDIF
300                 ENDIF
301              ENDIF
302     ! checking/setting corresponding j indices according to specified y
303     ! coordinates
304              IF(BC_J_S(BCV)/=UNDEFINED_I .OR. BC_J_N(BCV)/=UNDEFINED_I) THEN
305                 CALL LOCATION_CHECK (BC_J_S(BCV), J_S, BCV, 'BC - south')
306                 CALL LOCATION_CHECK (BC_J_N(BCV), J_N, BCV, 'BC - north')
307              ELSE
308                 BC_J_S(BCV) = J_S
309                 BC_J_N(BCV) = J_N
310              ENDIF
311           ENDIF
312     
313           IF(BC_Z_B(BCV)/=UNDEFINED .AND. BC_Z_T(BCV)/=UNDEFINED) THEN
314     ! setting indices to 1 if there is no variation in the k (z) direction
315              IF(NO_K)THEN
316                 K_B = 1
317                 K_T = 1
318              ELSE
319                 CALL CALC_CELL (ZERO, BC_Z_B(BCV), DZ, KMAX, K_B)
320                 K_B = K_B + 1
321                 CALL CALC_CELL (ZERO, BC_Z_T(BCV), DZ, KMAX, K_T)
322     ! BC along xy plane, checking if far bottom or far top of domain
323                 IF(BC_Z_B(BCV) == BC_Z_T(BCV)) THEN
324                    IF(COMPARE(BC_Z_B(BCV),ZERO)) THEN
325                       K_B = 1
326                       K_T = 1
327                    ELSEIF(COMPARE(BC_Z_B(BCV),ZLENGTH)) THEN
328                       K_B = KMAX2
329                       K_T = KMAX2
330                    ENDIF
331                 ENDIF
332              ENDIF
333     ! checking/setting corresponding j indices according to specified y
334     ! coordinates
335              IF(BC_K_B(BCV)/=UNDEFINED_I .OR.BC_K_T(BCV)/=UNDEFINED_I) THEN
336                 CALL LOCATION_CHECK (BC_K_B(BCV), K_B, BCV, 'BC - bottom')
337                 CALL LOCATION_CHECK (BC_K_T(BCV), K_T, BCV, 'BC - top')
338              ELSE
339                 BC_K_B(BCV) = K_B
340                 BC_K_T(BCV) = K_T
341              ENDIF
342           ENDIF
343     
344     
345     ! CHECK FOR VALID VALUES
346           IER = 0
347           IF (BC_K_B(BCV)<1 .OR. BC_K_B(BCV)>KMAX2) IER = 1
348           IF (BC_J_S(BCV)<1 .OR. BC_J_S(BCV)>JMAX2) IER = 1
349           IF (BC_I_W(BCV)<1 .OR. BC_I_W(BCV)>IMAX2) IER = 1
350           IF (BC_K_T(BCV)<1 .OR. BC_K_T(BCV)>KMAX2) IER = 1
351           IF (BC_J_N(BCV)<1 .OR. BC_J_N(BCV)>JMAX2) IER = 1
352           IF (BC_I_E(BCV)<1 .OR. BC_I_E(BCV)>IMAX2) IER = 1
353           IF (BC_K_B(BCV) > BC_K_T(BCV)) IER = 1
354           IF (BC_J_S(BCV) > BC_J_N(BCV)) IER = 1
355           IF (BC_I_W(BCV) > BC_I_E(BCV)) IER = 1
356     
357           IF(IER /= 0)THEN
358              WRITE(ERR_MSG,1100) BCV,                                      &
359                 'X', BC_X_W(BCV), BC_X_E(BCV),'I',BC_I_W(BCV),BC_I_E(BCV), &
360                 'Y', BC_Y_S(BCV), BC_Y_N(BCV),'J',BC_J_S(BCV),BC_J_N(BCV), &
361                 'Z', BC_Z_B(BCV), BC_Z_T(BCV),'K',BC_K_B(BCV),BC_K_T(BCV)
362              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
363           ENDIF
364     
365      1100 FORMAT('Error 1100: Invalid location specified for BC ',I3,'.',  &
366              3(/3x,A1,': ',g12.5,',',g12.5,8x,A1,': ',I8,',',I8),/         &
367              'Please correct the mfix.dat file.')
368     
369           CALL FINL_ERR_MSG
370     
371           RETURN
372     
373           END SUBROUTINE CHECK_BC_GEOMETRY_WALL
374     
375     
376     
377     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
378     !                                                                      !
379     !  Subroutine: CHECK_BC_GEOMETRY_FLOW                                  !
380     !  Author: P. Nicoletti                               Date: 10-DEC-91  !
381     !                                                                      !
382     !  Purpose: Find and validate i, j, k locations for flow BC's. Also    !
383     !           set value of bc_plane for flow BC's.                       !
384     !                                                                      !
385     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
386           SUBROUTINE CHECK_BC_GEOMETRY_FLOW(BCV)
387     
388     ! Global Variables:
389     !---------------------------------------------------------------------//
390     ! Boundary condition locations and corresponding grid index
391           use bc, only: BC_X_w, BC_X_e, BC_I_w, BC_I_e
392           use bc, only: BC_Y_s, BC_Y_n, BC_J_s, BC_J_n
393           use bc, only: BC_Z_b, BC_Z_t, BC_K_b, BC_K_t
394     ! Basic grid information
395           use geometry, only: NO_I, DX, IMAX, IMAX2, XMIN
396           use geometry, only: NO_J, DY, JMAX, JMAX2
397           use geometry, only: NO_K, DZ, KMAX, KMAX2
398     ! Flag: Reinitializing field conditions.
399           use run, only: REINITIALIZING
400     
401     ! Global Parameters:
402     !---------------------------------------------------------------------//
403           use param1, only: ZERO, UNDEFINED_I, UNDEFINED
404     
405     ! Use the error manager for posting error messages.
406     !---------------------------------------------------------------------//
407           use error_manager
408     
409           IMPLICIT NONE
410     
411     
412     ! Dummy Arguments:
413     !---------------------------------------------------------------------//
414     ! Index of boundary condition.
415           INTEGER, INTENT(in) :: BCV
416     
417     ! Local Variables:
418     !---------------------------------------------------------------------//
419     ! Calculated indices of the wall boundary
420           INTEGER :: I_w, I_e, J_s, J_n, K_b, K_t
421     ! Indices for error checking
422           INTEGER :: IER
423     
424     ! surface indictors:
425     ! a value of T indicates that the defined boundary region does not
426     ! vary in indicated coordinate direction. that is, if bc_x_w is
427     ! equal to bc_x_e then the boundary region must be in the yz plane
428           LOGICAL :: X_CONSTANT, Y_CONSTANT, Z_CONSTANT
429     !......................................................................!
430     
431     ! Skip this routine if reinitializing as BC locations cannot be changed.
432           IF(REINITIALIZING) RETURN
433     
434           CALL INIT_ERR_MSG("CHECK_BC_GEOMETRY_FLOW")
435     
436           X_CONSTANT = .TRUE.
437           Y_CONSTANT = .TRUE.
438           Z_CONSTANT = .TRUE.
439     
440           IF (BC_X_W(BCV)/=UNDEFINED .AND. BC_X_E(BCV)/=UNDEFINED) THEN
441              CALL CALC_CELL (XMIN, BC_X_W(BCV), DX, IMAX, I_W)
442              CALL CALC_CELL (XMIN, BC_X_E(BCV), DX, IMAX, I_E)
443              IF (BC_X_W(BCV) /= BC_X_E(BCV)) THEN
444                 X_CONSTANT = .FALSE.
445                 I_W = I_W + 1
446                 IF(BC_I_W(BCV)/=UNDEFINED_I.OR.BC_I_E(BCV)/=UNDEFINED_I)THEN
447                    CALL LOCATION_CHECK (BC_I_W(BCV), I_W, BCV, 'BC - west')
448                    CALL LOCATION_CHECK (BC_I_E(BCV), I_E, BCV, 'BC - east')
449                 ENDIF
450              ENDIF
451              BC_I_W(BCV) = I_W
452              BC_I_E(BCV) = I_E
453           ELSE
454              IF(BC_I_W(BCV) /= UNDEFINED_I) &
455                 CALL CALC_LOC (XMIN,DX,BC_I_W(BCV),BC_X_W(BCV))
456              IF(BC_I_E(BCV) /= UNDEFINED_I) &
457                 CALL CALC_LOC (XMIN,DX,BC_I_E(BCV),BC_X_E(BCV))
458              IF(BC_X_W(BCV) /= BC_X_E(BCV)) X_CONSTANT = .FALSE.
459           ENDIF
460     
461     ! If there is no variation in the I direction set indices to 1
462           IF(NO_I) THEN
463              BC_I_W(BCV) = 1
464              BC_I_E(BCV) = 1
465           ENDIF
466     
467           IF (BC_Y_S(BCV)/=UNDEFINED .AND. BC_Y_N(BCV)/=UNDEFINED) THEN
468              CALL CALC_CELL (ZERO, BC_Y_S(BCV), DY, JMAX, J_S)
469              CALL CALC_CELL (ZERO, BC_Y_N(BCV), DY, JMAX, J_N)
470              IF(BC_Y_S(BCV) /= BC_Y_N(BCV)) THEN
471                 Y_CONSTANT = .FALSE.
472                 J_S = J_S + 1
473                 IF(BC_J_S(BCV)/=UNDEFINED_I.OR.BC_J_N(BCV)/=UNDEFINED_I)THEN
474                    CALL LOCATION_CHECK (BC_J_S(BCV), J_S, BCV, 'BC - south')
475                    CALL LOCATION_CHECK (BC_J_N(BCV), J_N, BCV, 'BC - north')
476                 ENDIF
477              ENDIF
478              BC_J_S(BCV) = J_S
479              BC_J_N(BCV) = J_N
480           ELSE
481              IF(BC_J_S(BCV) /= UNDEFINED_I) &
482                 CALL CALC_LOC (ZERO,DY,BC_J_S(BCV),BC_Y_S(BCV))
483              IF(BC_J_N(BCV) /= UNDEFINED_I) &
484                 CALL CALC_LOC (ZERO,DY,BC_J_N(BCV),BC_Y_N(BCV))
485              IF (BC_Y_S(BCV) /= BC_Y_N(BCV)) Y_CONSTANT = .FALSE.
486           ENDIF
487     
488     ! If there is no variation in the J direction set indices to 1
489           IF(NO_J) THEN
490              BC_J_S(BCV) = 1
491              BC_J_N(BCV) = 1
492           ENDIF
493     
494           IF(BC_Z_B(BCV)/=UNDEFINED .AND. BC_Z_T(BCV)/=UNDEFINED) THEN
495              CALL CALC_CELL (ZERO, BC_Z_B(BCV), DZ, KMAX, K_B)
496              CALL CALC_CELL (ZERO, BC_Z_T(BCV), DZ, KMAX, K_T)
497              IF(BC_Z_B(BCV) /= BC_Z_T(BCV)) THEN
498                 Z_CONSTANT = .FALSE.
499                 K_B = K_B + 1
500                 IF(BC_K_B(BCV)/=UNDEFINED_I.OR.BC_K_T(BCV)/=UNDEFINED_I)THEN
501                    CALL LOCATION_CHECK (BC_K_B(BCV), K_B, BCV, 'BC - bottom')
502                    CALL LOCATION_CHECK (BC_K_T(BCV), K_T, BCV, 'BC - top')
503                 ENDIF
504              ENDIF
505              BC_K_B(BCV) = K_B
506              BC_K_T(BCV) = K_T
507           ELSE
508              IF(BC_K_B(BCV) /= UNDEFINED_I) &
509                 CALL CALC_LOC (ZERO,DZ,BC_K_B(BCV),BC_Z_B(BCV))
510              IF(BC_K_T(BCV) /= UNDEFINED_I) &
511                 CALL CALC_LOC (ZERO,DZ,BC_K_T(BCV),BC_Z_T(BCV))
512              IF(BC_Z_B(BCV) /= BC_Z_T(BCV)) Z_CONSTANT = .FALSE.
513           ENDIF
514     
515     ! If there is no variation in the K direction set indices to 1
516           IF(NO_K) THEN
517              BC_K_B(BCV) = 1
518              BC_K_T(BCV) = 1
519           ENDIF
520     
521     ! Check whether the boundary is a plane parallel to one of the three
522     ! coordinate planes
523           IF(BC_X_W(BCV)/=UNDEFINED .AND. BC_Y_S(BCV)/=UNDEFINED .AND. &
524              BC_Z_B(BCV)/=UNDEFINED) CALL CHECK_PLANE (X_CONSTANT, &
525              Y_CONSTANT, Z_CONSTANT, BCV, 'BC')
526     
527     
528     ! CHECK FOR VALID VALUES
529           IER = 0
530           IF(BC_I_W(BCV)<1 .OR. BC_I_W(BCV)>IMAX2) IER = 1
531           IF(BC_I_E(BCV)<1 .OR. BC_I_E(BCV)>IMAX2) IER = 1
532           IF(BC_J_S(BCV)<1 .OR. BC_J_S(BCV)>JMAX2) IER = 1
533           IF(BC_J_N(BCV)<1 .OR. BC_J_N(BCV)>JMAX2) IER = 1
534           IF(BC_K_B(BCV)<1 .OR. BC_K_B(BCV)>KMAX2) IER = 1
535           IF(BC_K_T(BCV)<1 .OR. BC_K_T(BCV)>KMAX2) IER = 1
536           IF(BC_K_B(BCV) > BC_K_T(BCV)) IER = 1
537           IF(BC_J_S(BCV) > BC_J_N(BCV)) IER = 1
538           IF(BC_I_W(BCV) > BC_I_E(BCV)) IER = 1
539     
540           IF(IER /= 0)THEN
541              WRITE(ERR_MSG,1100) BCV,                                      &
542                 'X', BC_X_W(BCV), BC_X_E(BCV),'I',BC_I_W(BCV),BC_I_E(BCV), &
543                 'Y', BC_Y_S(BCV), BC_Y_N(BCV),'J',BC_J_S(BCV),BC_J_N(BCV), &
544                 'Z', BC_Z_B(BCV), BC_Z_T(BCV),'K',BC_K_B(BCV),BC_K_T(BCV)
545              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
546           ENDIF
547     
548      1100 FORMAT('Error 1100: Invalid location specified for BC ',I3,'.',  &
549              3(/3x,A1,': ',g12.5,',',g12.5,8x,A1,': ',I8,',',I8),/         &
550              'Please correct the mfix.dat file.')
551     
552           CALL FINL_ERR_MSG
553     
554           RETURN
555     
556           END SUBROUTINE CHECK_BC_GEOMETRY_FLOW
557