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