File: /nfs/home/0/users/jenkins/mfix.git/model/check_data/check_internal_surfaces.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: CHECK_INTERNAL_SURFACES                                 !
4     !  Author: M. Syamlal                                 Date: 21-OCT-92  !
5     !                                                                      !
6     !  Purpose: Check internal surface specifications, and convert         !
7     !           physical locations to i, j, k's.                           !
8     !                                                                      !
9     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
10           SUBROUTINE CHECK_INTERNAL_SURFACES
11     
12     
13     ! Global Variables:
14     !---------------------------------------------------------------------//
15     ! Type of internal surface.
16           use is, only: IS_TYPE
17     ! Flag: IS is specified.
18           use is, only: IS_DEFINED
19     
20     ! Global Parameters:
21     !---------------------------------------------------------------------//
22     ! Maximum number of ISs that can be spedified.
23           USE param, only: DIMENSION_IS
24     
25     ! Use the error manager for posting error messages.
26     !---------------------------------------------------------------------//
27           use error_manager
28     
29           IMPLICIT NONE
30     
31     ! Local Variables:
32     !---------------------------------------------------------------------//
33     ! loop/variable indices
34           INTEGER :: ISV
35     !......................................................................!
36     
37           CALL INIT_ERR_MSG("CHECK_INTERNAL_SURFACES")
38     
39           CALL CHECK_IS_GEOMETRY
40     
41           DO ISV=1, DIMENSION_IS
42     
43     ! Check that the input is valid.
44              IF(IS_DEFINED(ISV)) THEN
45     ! Convert spatial coors into I/J/K values.
46                 CALL GET_IS(ISV)
47     ! Check that the required input is specifed for all IS types.
48                 SELECT CASE(IS_TYPE(ISV))
49                 CASE('SEMIPERMEABLE')
50                    CALL CHECK_IS_SEMIPERMEABLE(ISV)
51                 CASE('X_SEMIPERMEABLE', &
52                      'Y_SEMIPERMEABLE', &
53                      'Z_SEMIPERMEABLE')
54                    CALL CHECK_IS_SEMIPERMEABLE(ISV)
55                 END SELECT
56     ! Check that nothing is specifed for undefined IS regtions.
57              ELSE
58                 CALL CHECK_IS_OVERFLOW(ISV)
59              ENDIF
60           ENDDO
61     
62           CALL FINL_ERR_MSG
63     
64           RETURN
65           END SUBROUTINE CHECK_INTERNAL_SURFACES
66     
67     
68     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
69     !                                                                      !
70     !  Subroutine: CHECK_IS_GEOMETRY                                       !
71     !  Author: M. Syamlal                                 Date: 21-OCT-92  !
72     !                                                                      !
73     !  Purpose: Verify that IS geometry is specifed and that the IS_TYPE   !
74     !  is valid.                                                           !
75     !                                                                      !
76     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
77           SUBROUTINE CHECK_IS_GEOMETRY
78     
79           USE compar
80           USE fldvar
81           USE funits
82           USE geometry
83           USE indices
84           USE is
85           USE param
86           USE param1
87           USE physprop
88           USE run
89     
90     ! Use the error manager for posting error messages.
91     !---------------------------------------------------------------------//
92           use error_manager
93     
94           IMPLICIT NONE
95     
96     ! Global Parameters:
97     !---------------------------------------------------------------------//
98     
99     ! Local Variables:
100     !---------------------------------------------------------------------//
101     ! Loop/Variable indices
102           INTEGER :: ISV, I
103     ! Total number of valid IS types
104           INTEGER, PARAMETER :: DIM_ISTYPE = 4
105     ! Valid internal surface types
106           CHARACTER(LEN=16), DIMENSION(1:DIM_ISTYPE) :: VALID_IS_TYPE = (/&
107              'IMPERMEABLE     ', 'IP              ',&
108              'SEMIPERMEABLE   ', 'SP              '/)
109     !......................................................................!
110     
111           CALL INIT_ERR_MSG("CHECK_IS_GEOMETRY")
112     
113     ! Initialize the ALL_IS flag.
114           ANY_IS_DEFINED = .FALSE.
115     
116     ! DETERMINE WHICH INTERNAL SURFACE INDICES HAVE VALUES
117           L50: DO ISV = 1, DIMENSION_IS
118     
119              IS_DEFINED(ISV) = .FALSE.
120              IF (IS_X_W(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
121              IF (IS_X_E(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
122              IF (IS_Y_S(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
123              IF (IS_Y_N(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
124              IF (IS_Z_B(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
125              IF (IS_Z_T(ISV) /= UNDEFINED)   IS_DEFINED(ISV) = .TRUE.
126              IF (IS_I_W(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
127              IF (IS_I_E(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
128              IF (IS_J_S(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
129              IF (IS_J_N(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
130              IF (IS_K_B(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
131              IF (IS_K_T(ISV) /= UNDEFINED_I) IS_DEFINED(ISV) = .TRUE.
132     
133     
134              IF(.NOT.IS_DEFINED(ISV)) CYCLE L50
135     
136              ANY_IS_DEFINED = .TRUE.
137     
138              IF (IS_X_W(ISV)==UNDEFINED .AND. IS_I_W(ISV)==UNDEFINED_I) THEN
139                 IF (NO_I) THEN
140                    IS_X_W(ISV) = ZERO
141                 ELSE
142                    WRITE(ERR_MSG,1101) ISV, 'IS_X_w and IS_I_w '
143                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
144                 ENDIF
145              ENDIF
146     
147              IF(IS_X_E(ISV)==UNDEFINED .AND. IS_I_E(ISV)==UNDEFINED_I) THEN
148                 IF(NO_I) THEN
149                    IS_X_E(ISV) = XLENGTH
150                 ELSE
151                    WRITE(ERR_MSG,1101) ISV, 'IS_X_e and IS_I_e '
152                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
153                 ENDIF
154              ENDIF
155              IF(IS_Y_S(ISV)==UNDEFINED .AND. IS_J_S(ISV)==UNDEFINED_I) THEN
156                 IF(NO_J) THEN
157                    IS_Y_S(ISV) = ZERO
158                 ELSE
159                    WRITE(ERR_MSG,1101) ISV, 'IS_Y_s and IS_J_s '
160                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
161                 ENDIF
162              ENDIF
163              IF(IS_Y_N(ISV)==UNDEFINED .AND. IS_J_N(ISV)==UNDEFINED_I) THEN
164                 IF(NO_J) THEN
165                    IS_Y_N(ISV) = YLENGTH
166                 ELSE
167                    WRITE(ERR_MSG,1101) ISV, 'IS_Y_n and IS_J_n '
168                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
169                 ENDIF
170              ENDIF
171              IF(IS_Z_B(ISV)==UNDEFINED .AND. IS_K_B(ISV)==UNDEFINED_I) THEN
172                 IF(NO_K) THEN
173                    IS_Z_B(ISV) = ZERO
174                 ELSE
175                    WRITE(ERR_MSG,1101) ISV, 'IS_Z_b and IS_K_b '
176                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
177                 ENDIF
178              ENDIF
179              IF(IS_Z_T(ISV)==UNDEFINED .AND. IS_K_T(ISV)==UNDEFINED_I) THEN
180                 IF(NO_K) THEN
181                    IS_Z_T(ISV) = ZLENGTH
182                 ELSE
183                    WRITE(ERR_MSG,1101) ISV, 'IS_Z_t and IS_K_t '
184                    CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
185                 ENDIF
186              ENDIF
187     
188      1101 FORMAT('Error 1101: Internal surface ',I3,' is ill-defined.',/   &
189              A,' are not specified.',/'Please correct the mfix.dat file.')
190     
191     
192              DO I = 1, DIM_ISTYPE
193                 IF(VALID_IS_TYPE(I) == IS_TYPE(ISV)) THEN
194                    IF(MOD(I,2) == 0) IS_TYPE(ISV) = VALID_IS_TYPE(I-1)
195                    CYCLE L50
196                 ENDIF
197                 IF(VALID_IS_TYPE(I) == IS_TYPE(ISV)(3:16)) THEN
198                    IF(MOD(I,2) == 0) IS_TYPE(ISV)(3:16) = VALID_IS_TYPE(I-1)
199     
200                    SELECT CASE(IS_TYPE(ISV)(1:1))
201                    CASE('X', 'Y', 'Z'); CYCLE L50
202                    CASE DEFAULT
203                       WRITE(ERR_MSG, 1102) ISV, IS_TYPE(ISV)(1:1)
204                       CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
205                    END SELECT
206     
207      1102 FORMAT('Error 1102: Internal surface ',I3,' has an invalid ',&
208              'prefix: ',A,/'Please correct the mfix.dat file.')
209     
210                 ENDIF
211              END DO
212              WRITE(ERR_MSG, 1103) trim(iVar('IS_TYPE',ISV)),               &
213                 trim(IS_TYPE(ISV)), VALID_IS_TYPE
214              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
215     
216      1103 FORMAT('Error 1103: Illegal entry: ',A,' = ',A,/'Valid entries:',&
217              ' ',4(/5X,A,2x,A))
218     
219           ENDDO L50
220     
221           CALL FINL_ERR_MSG
222     
223           RETURN
224           END SUBROUTINE CHECK_IS_GEOMETRY
225     
226     
227     
228     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
229     !                                                                      !
230     !  Subroutine: CHECK_IS_SEMIPERMEABLE                                  !
231     !  Author: J.Musser                                   Date: 19-MAR-14  !
232     !                                                                      !
233     !  Purpose: Check that required input for semipermeable internal       !
234     !  surfaces is specified.                                              !
235     !                                                                      !
236     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
237           SUBROUTINE CHECK_IS_SEMIPERMEABLE(ISV)
238     
239     
240     ! Global Variables:
241     !---------------------------------------------------------------------//
242     ! Permeability coefficients for semipermeable internal surfaces.
243           USE is, only: IS_PC
244     
245     ! Global Parameters:
246     !---------------------------------------------------------------------//
247           USE param1, only: ZERO, UNDEFINED
248     
249     ! Use the error manager for posting error messages.
250     !---------------------------------------------------------------------//
251           use error_manager
252     
253     
254           IMPLICIT NONE
255     
256     
257     ! Dummy Arguments:
258     !---------------------------------------------------------------------//
259     ! Internal surface index
260           INTEGER, INTENT(in) :: ISV
261     !......................................................................!
262     
263           CALL INIT_ERR_MSG("CHECK_IS_SEMIPERMEABLE")
264     
265     
266     ! Check that the Darcy coefficient is specifed and valid.
267           IF(IS_PC(ISV,1) == UNDEFINED) THEN
268              WRITE(ERR_MSG, 1000) trim(iVar('IS_PC',ISV,1))
269              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
270           ENDIF
271     
272           IF(IS_PC(ISV,1) == ZERO) THEN
273              WRITE(ERR_MSG, 1001) trim(iVar('IS_PC',ISV,1)), '0.0'
274              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
275           ENDIF
276     
277     ! Check that the inertial resistance factor is specified.
278           IF(IS_PC(ISV,2) == UNDEFINED) THEN
279              WRITE(ERR_MSG, 1000) trim(iVar('IS_PC',ISV,2))
280              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
281           ENDIF
282     
283           CALL FINL_ERR_MSG
284     
285           RETURN
286     
287      1000 FORMAT('Error 1000: Required input not specified: ',A,/'Please ',&
288              'correct the mfix.dat file.')
289     
290      1001 FORMAT('Error 1001: Illegal or unknown input: ',A,' = ',A,/   &
291              'Please correct the mfix.dat file.')
292     
293           END SUBROUTINE CHECK_IS_SEMIPERMEABLE
294     
295     
296     
297     
298     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
299     !                                                                      !
300     !  Subroutine: CHECK_IS_OVERFLOW                                       !
301     !  Author: J.Musser                                   Date: 19-MAR-14  !
302     !                                                                      !
303     !  Purpose: Check internal surface specifications are not specifed for !
304     !  ISs that are not defined.                                           !
305     !                                                                      !
306     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
307           SUBROUTINE CHECK_IS_OVERFLOW(ISV)
308     
309     
310     ! Global Variables:
311     !---------------------------------------------------------------------//
312     ! Permeability coefficients for semipermeable internal surfaces.
313           USE is, only: IS_PC
314     
315     ! Global Parameters:
316     !---------------------------------------------------------------------//
317           USE param1, only: ZERO, UNDEFINED
318     
319     ! Use the error manager for posting error messages.
320     !---------------------------------------------------------------------//
321           use error_manager
322     
323           IMPLICIT NONE
324     
325     ! Dummy Arguments:
326     !---------------------------------------------------------------------//
327     ! Internal surface index.
328           INTEGER, INTENT(in) :: ISV
329     !......................................................................!
330     
331     
332           CALL INIT_ERR_MSG("CHECK_IS_OVERFLOW")
333     
334     ! Check that the Darcy coefficient is undefined.
335           IF(IS_PC(ISV,1) /= UNDEFINED) THEN
336              WRITE(ERR_MSG, 1100) trim(iVar('IS_PC',ISV,1))
337              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
338           ENDIF
339     
340     ! Check that the inertial resistance factor is undefined.
341           IF(IS_PC(ISV,2) /= ZERO) THEN
342              WRITE(ERR_MSG, 1100) trim(iVar('IS_PC',ISV,2))
343              CALL FLUSH_ERR_MSG(ABORT=.TRUE.)
344           ENDIF
345     
346           CALL FINL_ERR_MSG
347     
348           RETURN
349     
350      1100 FORMAT('Error 1100: ',A,' specified in an undefined IS region')
351     
352           END SUBROUTINE CHECK_IS_OVERFLOW
353     
354