MFIX  2016-1
utilities_mod.f
Go to the documentation of this file.
1 MODULE utilities
2 
3  IMPLICIT NONE
4 
5 CONTAINS
6 
7 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
8 ! !
9 ! function: mfix_isnan !
10 ! Purpose: check whether argument is NAN !
11 ! !
12 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
13  LOGICAL FUNCTION mfix_isnan(x)
14 
15 ! Dummy arguments
16 !---------------------------------------------------------------------//
17  double precision, intent(in) :: x
18 
19 ! Local variables
20 !---------------------------------------------------------------------//
21  CHARACTER(LEN=80) :: notnumber
22 !---------------------------------------------------------------------//
23 
24  mfix_isnan = .false.
25  WRITE(notnumber,*) x
26 ! To check for NaN's in x, see if x (a real number) contain a letter "N"
27 ! "n" or symbol "?", in which case it is a NaN (Not a Number)
28 
29  IF(index(notnumber,'?') > 0 .OR. &
30  index(notnumber,'n') > 0 .OR. &
31  index(notnumber,'N') > 0 ) THEN
32  mfix_isnan = .true.
33  RETURN
34  ENDIF
35 
36  RETURN
37  END FUNCTION mfix_isnan
38 
39 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
40 ! C
41 ! function: MAX_VEL_INLET C
42 ! Purpose: Find maximum velocity at inlets. C
43 ! C
44 ! Author: S. Benyahia Date: 26-AUG-05 C
45 ! C
46 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
47  DOUBLE PRECISION FUNCTION max_vel_inlet()
48 
49 ! Modules
50 !---------------------------------------------------------------------//
51  use bc, only: bc_defined, bc_type_enum
52  use bc, only: mass_inflow, p_inflow
53  use bc, only: bc_plane
54  use bc, only: bc_k_b, bc_k_t, bc_j_s, bc_j_n, bc_i_w, bc_i_e
55  use compar, only: dead_cell_at
56  use fldvar, only: u_g, v_g, w_g, u_s, v_s, w_s
57  use functions, only: funijk, is_on_mype_owns
58  use functions, only: im_of, jm_of, km_of
59  use mpi_utility, only: global_all_max
60  use param, only: dimension_bc
61  use param1, only: zero, small_number
62  use physprop, only: mmax
63  use run, only: units
65  IMPLICIT NONE
66 
67 ! Local variables
68 !---------------------------------------------------------------------//
69  INTEGER :: L, I, J, K, IJK, M
70  DOUBLE PRECISION :: maxVEL
71 !---------------------------------------------------------------------//
72 
73 ! initializing
74  maxvel = zero
75 
76  DO l = 1, dimension_bc
77 
78  IF(.NOT.(bc_defined(l).AND.(bc_type_enum(l)==mass_inflow .OR. &
79  bc_type_enum(l) == p_inflow))) cycle
80 
81  DO k = bc_k_b(l), bc_k_t(l)
82  DO j = bc_j_s(l), bc_j_n(l)
83  DO i = bc_i_w(l), bc_i_e(l)
84 
85  IF (.NOT.is_on_mype_owns(i,j,k)) cycle
86  IF (dead_cell_at(i,j,k)) cycle
87  ijk = funijk(i,j,k)
88 
89  SELECT CASE (bc_plane(l))
90  CASE ('E'); maxvel = max(maxvel,abs(u_g(ijk)))
91  CASE ('N'); maxvel = max(maxvel,abs(v_g(ijk)))
92  CASE ('T'); maxvel = max(maxvel,abs(w_g(ijk)))
93  CASE ('W'); maxvel = max(maxvel,abs(u_g(im_of(ijk))))
94  CASE ('S'); maxvel = max(maxvel,abs(v_g(jm_of(ijk))))
95  CASE ('B'); maxvel = max(maxvel,abs(w_g(km_of(ijk))))
96  END SELECT
97 
98  DO m=1,mmax
99  SELECT CASE (bc_plane(l))
100  CASE ('E'); maxvel = max(maxvel,abs(u_s(ijk,m)))
101  CASE ('N'); maxvel = max(maxvel,abs(v_s(ijk,m)))
102  CASE ('T'); maxvel = max(maxvel,abs(w_s(ijk,m)))
103  CASE ('W'); maxvel = max(maxvel,abs(u_s(im_of(ijk),m)))
104  CASE ('S'); maxvel = max(maxvel,abs(v_s(jm_of(ijk),m)))
105  CASE ('B'); maxvel = max(maxvel,abs(w_s(km_of(ijk),m)))
106  END SELECT
107  ENDDO
108 
109  ENDDO
110  ENDDO
111  ENDDO
112  ENDDO
113 
114  CALL global_all_max(maxvel, max_vel_inlet)
115 
116 ! If no inlet velocity is specified, use an upper limit defined in
117 ! toleranc_mod.f
118  IF(max_vel_inlet <= small_number) THEN
120  IF(units == 'SI') max_inlet_vel = 1d-2*max_allowed_vel
121  ELSE
122 ! Scale the value using a user defined scale factor
124  ENDIF
125 
126  RETURN
127  END FUNCTION max_vel_inlet
128 
129 
130 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
131 ! C
132 ! Function: CHECK_VEL_BOUND() C
133 ! Purpose: Check velocities upper bound to be less than speed of C
134 ! sound C
135 ! C
136 ! Author: S. Benyahia Date: 25-AUG-05 C
137 ! C
138 ! C
139 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
140  LOGICAL FUNCTION check_vel_bound ()
142 ! Modules
143 !---------------------------------------------------------------------//
144  use compar, only: ijkstart3, ijkend3
145  use discretelement, only: des_continuum_coupled, des_continuum_hybrid
146  use fldvar, only: ep_g, u_g, v_g, w_g
147  use fldvar, only: ep_s, u_s, v_s, w_s
148  use functions, only: fluid_at
149  use indices, only: i_of, j_of, k_of
150  use mpi_utility, only: global_all_or
151  use physprop, only: mmax
152  use toleranc, only: max_inlet_vel
153 
154  IMPLICIT NONE
155 
156 ! Local variables
157 !---------------------------------------------------------------------//
158  INTEGER :: M
159 ! Indices
160  INTEGER :: IJK
161  LOGICAL :: ALL_IS_ERROR
162 !---------------------------------------------------------------------//
163 
164 !!$omp parallel do private(IJK)
165 ! initializing
166  check_vel_bound = .false.
167  all_is_error = .false.
168 
169 loop_fluid : DO ijk = ijkstart3, ijkend3
170 
171  IF (fluid_at(ijk)) THEN
172  IF(abs(u_g(ijk)) > max_inlet_vel .OR. &
173  abs(v_g(ijk)) > max_inlet_vel .OR. &
174  abs(w_g(ijk)) > max_inlet_vel) THEN
175  check_vel_bound = .true.
176  WRITE(*,1000) max_inlet_vel, i_of(ijk), j_of(ijk), k_of(ijk), &
177  ep_g(ijk), u_g(ijk), v_g(ijk), w_g(ijk)
178  EXIT loop_fluid
179  ENDIF
180 
181  IF (.NOT.des_continuum_coupled .OR. des_continuum_hybrid) THEN
182  DO m = 1, mmax
183  IF(abs(u_s(ijk,m)) > max_inlet_vel .OR. &
184  abs(v_s(ijk,m)) > max_inlet_vel .OR. &
185  abs(w_s(ijk,m)) > max_inlet_vel) THEN
186  check_vel_bound = .true.
187  WRITE(*,1010) max_inlet_vel, i_of(ijk), j_of(ijk), k_of(ijk), m, &
188  ep_s(ijk, m), u_s(ijk,m), v_s(ijk,m), w_s(ijk,m)
189  EXIT loop_fluid
190  ENDIF
191  ENDDO
192  ENDIF ! end if(.not.des_continuum_coupled or des_continuum_hybrid)
193  ENDIF
194 
195  ENDDO loop_fluid
196 
197  CALL global_all_or(check_vel_bound, all_is_error)
198  IF(all_is_error) check_vel_bound = .true.
199 
200  RETURN
201  1000 FORMAT(1x,'Message from: CHECK_VEL_BOUND',/&
202  'WARNING: velocity higher than maximum allowed velocity: ', &
203  g12.5, '(to change this adjust the scale factor MAX_INLET_VEL_FAC)'/&
204  'in this cell: ','I = ',i4,2x,' J = ',i4,2x,' K = ',i4, /&
205  ' ','Epg = ', g12.5, 'Ug = ', g12.5, 'Vg = ', g12.5, 'Wg = ', g12.5)
206  1010 FORMAT(1x,'Message from: CHECK_VEL_BOUND',/&
207  'WARNING: velocity higher than maximum allowed velocity: ', &
208  g12.5,/&
209  'in this cell: ','I = ',i4,2x,' J = ',i4,2x,' K = ',i4,' M = ',i4, /&
210  ' ','Eps = ', g12.5,'Us = ', g12.5, 'Vs = ', g12.5, 'Ws = ', g12.5)
211 
212  END FUNCTION check_vel_bound
213 
214 
215 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
216 ! !
217 ! Function: SEEK_COMMENT !
218 ! Purpose: determine if (and where) a comment character appears !
219 ! in a data input line !
220 ! The function SEEK_COMMENT returns the index to where a comment !
221 ! character was found in the input data line. Equals MAXCOL + 1 !
222 ! if no-comment characters in the line. !
223 ! !
224 ! Author: P.Nicoletti Date: 25-NOV-91 !
225 ! !
226 ! !
227 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
228  INTEGER FUNCTION seek_comment (LINE, MAXCOL)
229  IMPLICIT NONE
230 
231 ! Dummy arguments
232 !---------------------------------------------------------------------//
233 ! input data line
234  CHARACTER(len=*) :: LINE
235 ! maximum column of input data line to search
236  INTEGER :: MAXCOL
237 
238 ! Local parameters
239 !---------------------------------------------------------------------//
240 ! the number of designated comment characters
241  INTEGER, PARAMETER :: DIM_COMMENT = 2
242 
243 ! Local variables
244 !---------------------------------------------------------------------//
245 ! loop indicies
246  INTEGER :: L, L2
247 ! the comment characters
248  CHARACTER, DIMENSION(DIM_COMMENT) :: COMMENT_CHAR
249 !---------------------------------------------------------------------//
250  DATA comment_char/'#', '!'/
251 
252  DO l = 1, maxcol
253  DO l2 = 1, dim_comment
254  IF (line(l:l) == comment_char(l2)) THEN
255  seek_comment = l
256  RETURN
257  ENDIF
258  END DO
259  END DO
260  seek_comment = maxcol + 1
261  RETURN
262  END FUNCTION seek_comment
263 
264 
265 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
266 ! !
267 ! Function: SEEK_END !
268 ! Purpose: determine where trailing blanks begin in a line !
269 ! The function SEEK_END returns the index to where the last !
270 ! character was found in the input data line. Equals MAXCOL !
271 ! if no trailing blank characters in the line. !
272 ! !
273 ! Author: P.Nicoletti, M. Syamlal Date: 7-AUG-92 !
274 ! !
275 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
276  INTEGER FUNCTION seek_end (LINE, MAXCOL)
277  IMPLICIT NONE
278 
279 ! Dummy arguments
280 !---------------------------------------------------------------------//
281 ! maximum column of input data line to search
282  INTEGER :: MAXCOL
283 ! input data line
284  CHARACTER :: LINE*(*)
285 
286 ! Local variables
287 !---------------------------------------------------------------------//
288  INTEGER :: L
289 !---------------------------------------------------------------------//
290  seek_end = 0
291  DO l = 1, maxcol
292  IF (line(l:l) /= ' ') seek_end = l
293  END DO
294  RETURN
295  END FUNCTION seek_end
296 
297 
298 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
299 ! !
300 ! Function: LINE_TOO_BIG !
301 ! Purpose: return an error condition if input data is located past !
302 ! column MAXCOL in the data input file !
303 ! The function LINE_TOO_BIG returns a value greater than 0 to !
304 ! indicate an error condition (data passed column MAXCOL in LINE) !
305 ! !
306 ! Author: P.Nicoletti Date: 25-NOV-91 !
307 ! !
308 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
309  INTEGER FUNCTION line_too_big (LINE, LINE_LEN, MAXCOL)
310  IMPLICIT NONE
311 
312 ! Dummy arguments
313 !---------------------------------------------------------------------//
314 ! input data line
315  CHARACTER(LEN=*) :: LINE
316 ! length of input data line
317  INTEGER :: LINE_LEN
318 ! maximum column that non-blank charcaters are
319 ! are in the input data line
320  INTEGER :: MAXCOL
321 
322 ! Local variables
323 !---------------------------------------------------------------------//
324 ! Loop index
325  INTEGER :: L
326 !---------------------------------------------------------------------//
327  DO l = maxcol + 1, line_len
328  IF (line(l:l) /= ' ') THEN
329  line_too_big = l
330  RETURN
331  ENDIF
332  ENDDO
333  line_too_big = 0
334  RETURN
335  END FUNCTION line_too_big
336 
337 
338 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
339 ! !
340 ! Function: BLANK_LINE !
341 ! Author: P. Nicoletti Date: 25-NOV-91 !
342 ! !
343 ! Purpose: Return .TRUE. if a line contains no input or only spaces. !
344 ! !
345 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
346  LOGICAL FUNCTION blank_line (line)
347  IMPLICIT NONE
348 
349 ! Dummy arguments
350 !---------------------------------------------------------------------//
351  CHARACTER :: LINE*(*)
352 
353 ! Local variables
354 !---------------------------------------------------------------------//
355  INTEGER :: L
356 !---------------------------------------------------------------------//
357  blank_line = .false.
358  DO l=1, len(line)
359  IF(line(l:l)/=' ' .and. line(l:l)/=' ')RETURN
360  ENDDO
361  blank_line = .true.
362  RETURN
363  END FUNCTION blank_line
364 
365 
366 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
367 ! !
368 ! Subroutine: bound_x !
369 ! Purpose: bound the values of x array !
370 ! !
371 ! Author: M. Syamlal Date: 15-SEP-98 !
372 ! !
373 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
374  SUBROUTINE bound_x(ARRAY, IJKMAX2)
376 ! Modules
377 !---------------------------------------------------------------------//
378  USE param, only: dimension_3
379  USE param1, only: one, zero
380  IMPLICIT NONE
381 
382 ! Dummy arguments
383 !---------------------------------------------------------------------//
384 ! Maximum dimension
385  INTEGER :: IJKMAX2
386 ! Array
387  DOUBLE PRECISION :: Array(dimension_3)
388 !--------------------------------------------------------------------//
389  IF (ijkmax2 > 0) THEN
390  array(:) = min(one,max(zero,array(:)))
391  ENDIF
392  RETURN
393  END SUBROUTINE bound_x
394 
395 END MODULE utilities
integer, dimension(dimension_bc) bc_k_b
Definition: bc_mod.f:70
double precision, dimension(:,:), allocatable v_s
Definition: fldvar_mod.f:105
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
double precision, dimension(:), allocatable ep_g
Definition: fldvar_mod.f:15
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
integer, dimension(dimension_bc) bc_i_w
Definition: bc_mod.f:54
double precision, dimension(:,:), allocatable w_s
Definition: fldvar_mod.f:117
integer, dimension(dimension_bc) bc_j_n
Definition: bc_mod.f:66
double precision max_inlet_vel
Definition: toleranc_mod.f:40
double precision, parameter max_allowed_vel
Definition: toleranc_mod.f:48
integer, parameter dimension_bc
Definition: param_mod.f:61
integer, dimension(dimension_bc) bc_type_enum
Definition: bc_mod.f:146
integer function seek_comment(LINE, MAXCOL)
logical function check_vel_bound()
double precision, dimension(:,:), allocatable u_s
Definition: fldvar_mod.f:93
character, dimension(dimension_bc) bc_plane
Definition: bc_mod.f:217
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
integer, dimension(dimension_bc) bc_k_t
Definition: bc_mod.f:74
integer mmax
Definition: physprop_mod.f:19
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
double precision, parameter small_number
Definition: param1_mod.f:24
integer, dimension(dimension_bc) bc_j_s
Definition: bc_mod.f:62
integer function seek_end(LINE, MAXCOL)
double precision, dimension(:), allocatable v_g
Definition: fldvar_mod.f:99
logical, dimension(dimension_bc) bc_defined
Definition: bc_mod.f:207
double precision, dimension(:), allocatable w_g
Definition: fldvar_mod.f:111
Definition: run_mod.f:13
Definition: param_mod.f:2
character(len=16) units
Definition: run_mod.f:30
integer function line_too_big(LINE, LINE_LEN, MAXCOL)
integer ijkstart3
Definition: compar_mod.f:80
double precision, dimension(:), allocatable u_g
Definition: fldvar_mod.f:87
double precision function ep_s(IJK, xxM)
Definition: fldvar_mod.f:178
logical function mfix_isnan(x)
Definition: utilities_mod.f:14
subroutine bound_x(ARRAY, IJKMAX2)
double precision function max_vel_inlet()
Definition: utilities_mod.f:48
logical function blank_line(line)
double precision max_inlet_vel_fac
Definition: toleranc_mod.f:43
integer, dimension(dimension_bc) bc_i_e
Definition: bc_mod.f:58
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23