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