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

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  function: isNaN                                                     !
4     !  Purpose: check whether argument is NAN                              !
5     !                                                                      !
6     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
7     
8           LOGICAL FUNCTION isNan(x)
9     
10     !-----------------------------------------------
11     ! Dummy arguments
12     !-----------------------------------------------
13           double precision x
14     !-----------------------------------------------
15     ! Local variables
16     !-----------------------------------------------
17           CHARACTER(LEN=80) :: notnumber
18     !-----------------------------------------------
19     
20           isNan = .False.
21           WRITE(notnumber,*) x
22     ! To check for NaN's in x, see if x (a real number) contain a letter "N"
23     ! "n" or symbol "?", in which case it is a NaN (Not a Number)
24     
25           IF(INDEX(notnumber,'?') > 0 .OR.     &
26              INDEX(notnumber,'n') > 0 .OR.     &
27              INDEX(notnumber,'N') > 0 ) THEN
28             isNan = .TRUE.
29              RETURN
30           ENDIF
31     
32           RETURN
33           END FUNCTION isNan
34     
35     
36     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
37     !                                                                      C
38     !  function: MAX_VEL_INLET                                             C
39     !  Purpose: Find maximum velocity at inlets.                           C
40     !                                                                      C
41     !  Author: S. Benyahia                                Date: 26-AUG-05  C
42     !  Reviewer:                                          Date: dd-mmm-yy  C
43     !                                                                      C
44     !  Literature/Document References:                                     C
45     !                                                                      C
46     !  Variables referenced:                                               C
47     !  Variables modified:                                                 C
48     !  Local variables:                                                    C
49     !                                                                      C
50     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
51     
52           DOUBLE PRECISION FUNCTION MAX_VEL_INLET()
53     
54     !-----------------------------------------------
55     ! Modules
56     !-----------------------------------------------
57           USE param
58           USE param1
59           USE parallel
60           USE bc
61           USE fldvar
62           USE geometry
63           USE physprop
64           USE indices
65           USE constant
66           USE run
67           USE compar
68           USE discretelement
69           USE functions
70     
71           IMPLICIT NONE
72     !-----------------------------------------------
73     ! Local variables
74     !-----------------------------------------------
75           INTEGER :: L, I, J, K, IJK, IJK2, M
76     !-----------------------------------------------
77     
78     ! initializing
79           MAX_VEL_INLET = ZERO
80     
81           DO L = 1, DIMENSION_BC
82              IF (BC_DEFINED(L)) THEN
83                 IF (BC_TYPE(L) == 'MASS_INFLOW' .OR. BC_TYPE(L) == 'P_INFLOW') THEN
84     
85                    DO K = BC_K_B(L), BC_K_T(L)
86                       DO J = BC_J_S(L), BC_J_N(L)
87                          DO I = BC_I_W(L), BC_I_E(L)
88                             IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
89                             IF (DEAD_CELL_AT(I,J,K)) CYCLE  ! skip dead cells
90                             IJK = FUNIJK(I,J,K)
91     
92                             SELECT CASE (BC_PLANE(L))
93                             CASE ('S')
94                                IJK2 = JM_OF(IJK)
95                                IF( ABS(V_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_G(IJK2))
96                             CASE ('N')
97                                IF( ABS(V_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_G(IJK))
98                             CASE ('W')
99                                IJK2 = IM_OF(IJK)
100                                IF( ABS(U_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_G(IJK2))
101                             CASE ('E')
102                                IF( ABS(U_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_G(IJK))
103                             CASE ('B')
104                                IJK2 = KM_OF(IJK)
105                                IF( ABS(W_G(IJK2)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_G(IJK2))
106                             CASE ('T')
107                                IF( ABS(W_G(IJK)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_G(IJK))
108                             END SELECT
109     
110                            IF (.NOT.DES_CONTINUUM_COUPLED .OR. DES_CONTINUUM_HYBRID) THEN
111                               SELECT CASE (BC_PLANE(L))
112                                CASE ('S')
113                                   IJK2 = JM_OF(IJK)
114                                   DO M = 1, MMAX
115                                      IF( ABS(V_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_s(IJK2, M))
116                                   ENDDO
117                                CASE ('N')
118                                   DO M = 1, MMAX
119                                     IF( ABS(V_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(V_s(IJK, M))
120                                   ENDDO
121                                CASE ('W')
122                                   IJK2 = IM_OF(IJK)
123                                   DO M = 1, MMAX
124                                     IF( ABS(U_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_s(IJK2, M))
125                                   ENDDO
126                                CASE ('E')
127                                   DO M = 1, MMAX
128                                     IF( ABS(U_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(U_s(IJK, M))
129                                   ENDDO
130                                CASE ('B')
131                                   IJK2 = KM_OF(IJK)
132                                   DO M = 1, MMAX
133                                     IF( ABS(W_s(IJK2, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_s(IJK2, M))
134                                   ENDDO
135                                CASE ('T')
136                                   DO M = 1, MMAX
137                                     IF( ABS(W_s(IJK, M)) > MAX_VEL_INLET ) MAX_VEL_INLET = ABS(W_s(IJK, M))
138                                   ENDDO
139                                END SELECT
140                             ENDIF   ! end if (.not.des_continuum_coupled .or. des_continuum_hybrid)
141     
142                          ENDDO
143                       ENDDO
144                    ENDDO
145     
146                ENDIF
147              ENDIF
148           ENDDO
149     
150           RETURN
151           END FUNCTION MAX_VEL_INLET
152     
153     
154     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
155     !                                                                      C
156     !  Function: CHECK_VEL_BOUND()                                         C
157     !  Purpose: Check velocities upper bound to be less than speed of      C
158     !           sound                                                      C
159     !                                                                      C
160     !  Author: S. Benyahia                                Date: 25-AUG-05  C
161     !  Reviewer:                                          Date: dd-mmm-yy  C
162     !                                                                      C
163     !                                                                      C
164     !  Literature/Document References:                                     C
165     !                                                                      C
166     !  Variables referenced:                                               C
167     !  Variables modified:                                                 C
168     !  Local variables:                                                    C
169     !                                                                      C
170     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
171     
172           LOGICAL FUNCTION CHECK_VEL_BOUND ()
173     
174     !-----------------------------------------------
175     ! Modules
176     !-----------------------------------------------
177           USE param
178           USE param1
179           USE parallel
180           USE fldvar
181           USE bc
182           USE geometry
183           USE physprop
184           USE indices
185           USE run
186           USE toleranc
187           USE compar
188           USE mpi_utility
189           USE discretelement
190           USE functions
191     
192           IMPLICIT NONE
193     !-----------------------------------------------
194     ! Local variables
195     !-----------------------------------------------
196           INTEGER :: M
197     ! Indices
198           INTEGER :: IJK
199           LOGICAL :: ALL_IS_ERROR
200     !-----------------------------------------------
201     
202     !!$omp   parallel do private(IJK)
203     ! initializing
204           CHECK_VEL_BOUND = .FALSE.
205           ALL_IS_ERROR    = .FALSE.
206     
207     LOOP_FLUID : DO IJK = IJKSTART3, IJKEND3
208     
209              IF (FLUID_AT(IJK)) THEN
210                 IF(ABS(U_G(IJK)) > MAX_INLET_VEL .OR. &
211                    ABS(V_G(IJK)) > MAX_INLET_VEL .OR. &
212                    ABS(W_G(IJK)) > MAX_INLET_VEL) THEN
213                    CHECK_VEL_BOUND = .TRUE.
214                    WRITE(*,1000) MAX_INLET_VEL, I_OF(IJK), J_OF(IJK), K_OF(IJK), &
215                                  EP_g(IJK), U_G(IJK), V_G(IJK), W_G(IJK)
216                    EXIT LOOP_FLUID
217                 ENDIF
218     
219                 IF (.NOT.DES_CONTINUUM_COUPLED .OR. DES_CONTINUUM_HYBRID) THEN
220                    DO M = 1, MMAX
221                      IF(ABS(U_S(IJK,M)) > MAX_INLET_VEL .OR. &
222                         ABS(V_S(IJK,M)) > MAX_INLET_VEL .OR. &
223                         ABS(W_S(IJK,M)) > MAX_INLET_VEL) THEN
224                        CHECK_VEL_BOUND = .TRUE.
225                        WRITE(*,1010) MAX_INLET_VEL, I_OF(IJK), J_OF(IJK), K_OF(IJK), M, &
226                                      EP_s(IJK, M), U_S(IJK,M), V_S(IJK,M), W_S(IJK,M)
227                        EXIT LOOP_FLUID
228                      ENDIF
229                    ENDDO
230                 ENDIF   ! end if(.not.des_continuum_coupled or des_continuum_hybrid)
231              ENDIF
232     
233           ENDDO LOOP_FLUID
234     
235           CALL GLOBAL_ALL_OR(CHECK_VEL_BOUND, ALL_IS_ERROR)
236           IF(ALL_IS_ERROR) CHECK_VEL_BOUND = .TRUE.
237     
238           RETURN
239      1000 FORMAT(1X,'Message from: CHECK_VEL_BOUND',/&
240                 'WARNING: velocity higher than maximum allowed velocity: ', &
241                 G12.5, '(to change this adjust the scale factor MAX_INLET_VEL_FAC)'/&
242                 'in this cell: ','I = ',I4,2X,' J = ',I4,2X,' K = ',I4, /&
243                 '  ','Epg = ', G12.5, 'Ug = ', G12.5, 'Vg = ', G12.5, 'Wg = ', G12.5)
244      1010 FORMAT(1X,'Message from: CHECK_VEL_BOUND',/&
245                 'WARNING: velocity higher than maximum allowed velocity: ', &
246                 G12.5,/&
247                 'in this cell: ','I = ',I4,2X,' J = ',I4,2X,' K = ',I4,' M = ',I4, /&
248                 '  ','Eps = ', G12.5,'Us = ', G12.5, 'Vs = ', G12.5, 'Ws = ', G12.5)
249     
250           END FUNCTION CHECK_VEL_BOUND
251     
252