MFIX  2016-1
set_ps.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Module name: CHECK_DATA_09 C
4 ! Purpose: Check point source specifications. C
5 ! C
6 ! Author: J. Musser Date: 10-JUN-13 C
7 ! C
8 ! Literature/Document References: C
9 ! C
10 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
11  SUBROUTINE set_ps
12 
13  use compar
14  use exit, only: mfix_exit
15  use functions
16  use geometry
17  use mpi_utility
18  use param
19  use param1, only: zero, small_number, undefined
20  use physprop
21  use ps
22  use run
23 
24  implicit none
25 
26  INTEGER :: IJK, I, J, K, M, NN
27 
28  INTEGER PSV
29 
30  CHARACTER(LEN=64) :: eMsg
31 
32  INTEGER :: PS_SIZE
33 
34  DOUBLE PRECISION, allocatable :: lData_dp(:)
35  DOUBLE PRECISION, allocatable :: gData_dp(:)
36 
37  LOGICAL, parameter :: dbg_PS = .false.
38 
39  if(.NOT.point_source) return
40 
41 ! DETERMINE WHICH BOUNDARY CONDITION INDICES HAVE VALUES
42  l50: do psv = 1, dimension_ps
43 
44  IF(.NOT.ps_defined(psv)) cycle l50
45 
46 
47 ! Calculate the velocity magnitude and normalize the axial components.
48  CALL calc_ps_vel_mag(ps_vel_mag_g(psv), ps_u_g(psv), &
49  ps_v_g(psv), ps_w_g(psv))
50 
52  ps_t_g(psv), ps_x_g(psv,:), 0, c_pg0, dim_n_g, mw_g)
53 
54  do m=1, mmax
55  CALL calc_ps_vel_mag(ps_vel_mag_s(psv,m), ps_u_s(psv,m), &
56  ps_v_s(psv,m), ps_w_s(psv,m))
57 
58  CALL calc_ps_cpxmflow(ps_cpxmflow_s(psv,m), &
59  ps_massflow_s(psv,m), ps_t_s(psv,m), ps_x_s(psv,m,:), m,&
60  c_ps0(m), dim_n_s, mw_s(m,:))
61  enddo
62 
63 
64 ! Calculate the number of cells comprising the point source. This
65 ! information is used to allocate some temp arrays.
66 !---------------------------------------------------------------------//
67  ps_size = (ps_i_e(psv) - ps_i_w(psv) + 1) * &
68  (ps_j_n(psv) - ps_j_s(psv) + 1)
69  if(do_k) ps_size = ps_size * (ps_k_t(psv) - ps_k_b(psv) + 1)
70 
71  if(ps_size < 1) then
72  emsg = ''; write(emsg,"('Invalid PS size: ', I4)")ps_size
73  goto 500
74  endif
75 
76 
77  allocate(ldata_dp( 0:numpes-1)); ldata_dp = zero
78  allocate(gdata_dp( 0:numpes-1)); gdata_dp = zero
79 
80 
81 ! Calculate the volume of the PointSource cells
82 !---------------------------------------------------------------------//
83 ! Initialize the loop counter
84  ps_volume(psv) = zero
85 
86  do k = ps_k_b(psv), ps_k_t(psv)
87  do j = ps_j_s(psv), ps_j_n(psv)
88  do i = ps_i_w(psv), ps_i_e(psv)
89 
90  if(is_on_mype_owns(i, j, k)) then
91  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
92  ijk = funijk(i,j,k)
93 
94  if(fluid_at(ijk)) &
95  ldata_dp(mype) = ldata_dp(mype) + vol(ijk)
96  endif
97 
98  enddo
99  enddo
100  enddo
101 
102 ! Each process (in DMP) only knows about the volume of the point source
103 ! it sees. Invoke send/recv so that all process can calculate the total
104 ! volume.
105  CALL global_all_sum(ldata_dp, gdata_dp)
106 
107  ps_volume(psv) = sum(gdata_dp)
108  if(ps_volume(psv) == zero) then
109  emsg = 'No PS_VOLUME == ZERO'
110  CALL debug_ps(psv, ps_size)
111  goto 501
112  endif
113 
114  if(allocated(ldata_dp)) deallocate(ldata_dp)
115  if(allocated(gdata_dp)) deallocate(gdata_dp)
116 
117 
118  IF(dbg_ps) CALL debug_ps(psv, ps_size)
119 
120  enddo l50
121 
122  return
123 
124  500 continue
125  if(mype == pe_io) &
126  write(*,"('PointSource setup Error: ',A)") trim(emsg)
127 
128  call mfix_exit(mype)
129 
130  501 continue
131  write(*,"('PointSource setup Error: ',I3,2x,A)") mype, trim(emsg)
132 
133  call mfix_exit(mype)
134 
135  RETURN
136 
137  contains
138 
139 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
140 ! C
141 ! Module name: CALC_PS_CpxMFLOW C
142 ! Purpose: Calculate velocity magnitude and normalize U/V/W. C
143 ! C
144 ! Author: J. Musser Date: 10-JUN-13 C
145 ! C
146 ! Literature/Document References: C
147 ! C
148 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
149  SUBROUTINE calc_ps_cpxmflow(CpxMFLOW, PS_MFLOW, PS_T, PS_X, lM, &
150  cp0, ldim_n, lmw)
152  use constant, only: gas_const_cal
153  use read_thermochemical, only: calc_cpor
154 
155  DOUBLE PRECISION, intent(out) :: CpxMFLOW
156 
157  INTEGER, intent(in) :: lM
158  INTEGER, intent(in) :: lDIM_N
159 
160  DOUBLE PRECISION, intent(in) :: Cp0
161  DOUBLE PRECISION, intent(in) :: PS_MFLOW
162  DOUBLE PRECISION, intent(in) :: PS_T ! Temperature
163  DOUBLE PRECISION, intent(in) :: PS_X(ldim_n) ! Species Mass Frac
164 
165  DOUBLE PRECISION, intent(in) :: lMW(ldim_n)
166 
167  INTEGER :: IER
168 
169 ! If there is no mass flow for this phase, then there is no need to
170 ! calculate a CPxMFLUX. Set it to zero and return.
171  if(.NOT.energy_eq .OR. ps_mflow == zero) then
172  cpxmflow = zero
173  return
174  endif
175 
176 ! Calculate the average specific heat.
177  if(cp0 == undefined) then
178  IF(.NOT.database_read) call read_database0()
179  cpxmflow = zero
180  do nn = 1, nmax(lm)
181  cpxmflow = cpxmflow + ps_x(nn) * (gas_const_cal / lmw(nn)) * &
182  calc_cpor(ps_t, lm, nn)
183  enddo
184  else
185  cpxmflow = cp0
186  endif
187 
188 ! Unit conversion (if needed)
189  if(units == 'SI') cpxmflow = 4.183925d3*cpxmflow
190  cpxmflow = cpxmflow*ps_mflow
191 
192  END SUBROUTINE calc_ps_cpxmflow
193 
194 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
195 ! C
196 ! Module name: CALC_PS_VEL_MAG C
197 ! Purpose: Calculate velocity magnitude and normalize U/V/W. C
198 ! C
199 ! Author: J. Musser Date: 10-JUN-13 C
200 ! C
201 ! Literature/Document References: C
202 ! C
203 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
204  SUBROUTINE calc_ps_vel_mag(VEL_MAG, lU, lV, lW)
206  DOUBLE PRECISION, intent(inout) :: VEL_MAG
207  DOUBLE PRECISION, intent(inout) :: lU, lV, lW
208 
209 ! Normalize velocities:
210  vel_mag = lu**2 + lv**2
211  if(do_k) vel_mag = vel_mag + lw**2
212 
213  vel_mag = sqrt(vel_mag)
214 
215  if(vel_mag > small_number) then
216  lu = lu/vel_mag
217  lv = lv/vel_mag
218  lw = lw/vel_mag
219  else
220  vel_mag = zero
221  lu = zero
222  lv = zero
223  lw = zero
224  endif
225 
226 
227  END SUBROUTINE calc_ps_vel_mag
228 
229 
230  END SUBROUTINE set_ps
231 
232 
233 
234 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
235 ! C
236 ! Module name: DEBUG_PS C
237 ! C
238 ! Purpose: Write out some information about that point source that C
239 ! may be useful in debugging. C
240 ! C
241 ! Author: J. Musser Date: 24-JUN-13 C
242 ! C
243 ! Literature/Document References: C
244 ! C
245 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
246  SUBROUTINE debug_ps(lPSV, lPS_SIZE)
248  use bc
249  use compar
250  use constant
251  use cutcell
252  use fldvar
253  use geometry
254  use ic
255  use indices
256  use mflux
257  use parallel
258  use param
259  use param1
260  use physprop
261  use run
262  use sendrecv
263  use toleranc
264  use usr
265  use rxns
266  use ps
267  use mpi_utility
268  use functions
269 
270  IMPLICIT NONE
271 
272 ! Index of PS source to debug.
273  INTEGER, intent(in) :: lPSV
274 ! Number of cells comprising the point source.
275  INTEGER, intent(in) :: lPS_SIZE
276 
277  INTEGER :: IJK, I, J, K, M, NN
278 
279  INTEGER :: lc1
280 
281  INTEGER, allocatable :: lFlags_i(:,:)
282  INTEGER, allocatable :: gFlags_i(:,:)
283 
284  if(mype == pe_io) then
285  write(*,"(3/,3x,'Debug Point Source Index: ',I3)") lpsv
286  write(*,"(/3x,'Size: ',I4)") lps_size
287  endif
288 
289  allocate(lflags_i(lps_size,1:2) ); lflags_i = 0
290  allocate(gflags_i(lps_size,1:2) ); gflags_i = 0
291 
292  lc1 = 0
293 
294  do k = ps_k_b(lpsv), ps_k_t(lpsv)
295  do j = ps_j_s(lpsv), ps_j_n(lpsv)
296  do i = ps_i_w(lpsv), ps_i_e(lpsv)
297 
298  lc1 = lc1 + 1
299  if(is_on_mype_owns(i, j, k)) then
300  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
301  ijk = funijk(i,j,k)
302  if(fluid_at(ijk)) then
303  lflags_i(lc1,1) = mype
304  lflags_i(lc1,2) = flag(ijk)
305  endif
306  endif
307  enddo
308  enddo
309  enddo
310 
311 ! Collect flag information on root.
312  CALL global_sum(lflags_i, gflags_i)
313 
314 ! Write some information to the screen.
315  if(mype == pe_io) then
316  write(*,"(/5x,'Location:')")
317  write(*,"( 5x,'X:',2(2x,g12.5),' :: ',2(2x,I4))")&
318  ps_x_w(lpsv), ps_x_e(lpsv), ps_i_w(lpsv), ps_i_e(lpsv)
319  write(*,"( 5x,'Y:',2(2x,g12.5),' :: ',2(2x,I4))")&
320  ps_y_s(lpsv), ps_y_n(lpsv), ps_j_s(lpsv), ps_j_n(lpsv)
321  if(do_k)write(*,"( 5x,'Z:',2(2x,g12.5),' :: ',2(2x,I4))")&
322  ps_z_b(lpsv), ps_z_t(lpsv), ps_k_b(lpsv), ps_k_t(lpsv)
323 
324  write(*,"(/5x,'Volume: ',g12.5)") ps_volume(lpsv)
325 
326 
327  if(ps_massflow_g(lpsv) > small_number) then
328  write(*,"(//5x,'Point Source Gas Phase:')")
329  write(*,"(7x,'Mass Flow Rate: ',g12.5)")ps_massflow_g(lpsv)
330  write(*,"(7x,'Velocity Magnitude: ',g12.5)") ps_vel_mag_g(lpsv)
331  write(*,"(7x,'Normal:')")
332  write(*,"(9x,'x-Axis: ',g12.5)")ps_u_g(lpsv)
333  write(*,"(9x,'y-Axis: ',g12.5)")ps_v_g(lpsv)
334  if(do_k) write(*,"(9x,'z-Axis: ',g12.5)")ps_w_g(lpsv)
335  if(energy_eq) &
336  write(*,"(7x,'Temperature: ',g12.5)")ps_t_g(lpsv)
337  if(species_eq(0)) then
338  write(*,"(7x,'Species Composition:')")
339  do nn=1,nmax(0)
340  write(*,"(9x,A,': ',g12.5)") &
341  trim(species_alias_g(nn)), ps_x_g(lpsv,nn)
342  enddo
343  endif
344  else
345  write(*,"(//5x,'No gas phase point source.')")
346  endif
347 
348 
349  do m=1,mmax
350  if(ps_massflow_s(lpsv,m) > small_number) then
351  write(*,"(//5x,'Point Source Solids Phase ',I1,':')")m
352  write(*,"(7x,'Mass Flow Rate: ',g12.5)")ps_massflow_s(lpsv,m)
353  write(*,"(7x,'Velocity Magnitude: ',g12.5)") ps_vel_mag_s(lpsv,m)
354  write(*,"(7x,'Normal:')")
355  write(*,"(9x,'x-Axis: ',g12.5)")ps_u_s(lpsv,m)
356  write(*,"(9x,'y-Axis: ',g12.5)")ps_v_s(lpsv,m)
357  if(do_k) write(*,"(9x,'z-Axis: ',g12.5)")ps_w_s(lpsv,m)
358  if(energy_eq) &
359  write(*,"(7x,'Temperature: ',g12.5)")ps_t_s(lpsv,m)
360  if(species_eq(m)) then
361  write(*,"(7x,'Species Composition:')")
362  do nn=1,nmax(m)
363  write(*,"(9x,A,': ',g12.5)") &
364  trim(species_alias_s(m,nn)), ps_x_s(lpsv,m,nn)
365  enddo
366  endif
367  else
368  write(*,"(//5x,'No solids phase ',I1,' point source.')") m
369  endif
370  enddo
371 
372  write(*,"(//5x,'Point Source Cells:')")
373  write(*,"(9x,'IJK',3(6x,A1),3x,'OWNS',3x,'FLAG')") 'I','J','K'
374 
375  lc1 = 0
376  do k = ps_k_b(lpsv), ps_k_t(lpsv)
377  do j = ps_j_s(lpsv), ps_j_n(lpsv)
378  do i = ps_i_w(lpsv), ps_i_e(lpsv)
379  IF (dead_cell_at(i,j,k)) cycle ! skip dead cells
380  lc1 = lc1 + 1
381  write(*,"(4x,I8,5(3x,I4))") ijk, i, j, k, gflags_i(lc1,:)
382  enddo
383  enddo
384  enddo
385 
386  endif
387 
388  if(allocated(lflags_i)) deallocate(lflags_i)
389  if(allocated(gflags_i)) deallocate(gflags_i)
390 
391  END SUBROUTINE debug_ps
392 
integer, dimension(dimension_ps) ps_i_w
Definition: ps_mod.f:40
integer, parameter dim_n_g
Definition: param_mod.f:69
double precision, dimension(dim_m) c_ps0
Definition: physprop_mod.f:83
double precision, dimension(dimension_ps) ps_v_g
Definition: ps_mod.f:52
double precision, dimension(dimension_ps) ps_t_g
Definition: ps_mod.f:62
double precision, dimension(dimension_ps, dim_m) ps_v_s
Definition: ps_mod.f:70
double precision, dimension(dimension_ps) ps_vel_mag_g
Definition: ps_mod.f:56
double precision c_pg0
Definition: physprop_mod.f:74
subroutine set_ps
Definition: set_ps.f:12
Definition: rxns_mod.f:1
logical, dimension(0:dim_m) species_eq
Definition: run_mod.f:115
double precision, dimension(dimension_ps, dim_m) ps_vel_mag_s
Definition: ps_mod.f:74
integer, dimension(dimension_ps) ps_j_n
Definition: ps_mod.f:43
double precision, dimension(dimension_ps) ps_y_n
Definition: ps_mod.f:35
double precision, parameter undefined
Definition: param1_mod.f:18
double precision, dimension(dimension_ps) ps_cpxmflow_g
Definition: ps_mod.f:63
double precision, dimension(dimension_ps) ps_z_b
Definition: ps_mod.f:36
double precision, dimension(dimension_ps) ps_massflow_g
Definition: ps_mod.f:48
character(len=32), dimension(dim_n_g) species_alias_g
Definition: rxns_mod.f:48
logical, dimension(dimension_ps) ps_defined
Definition: ps_mod.f:29
double precision, dimension(dim_n_g) mw_g
Definition: physprop_mod.f:124
double precision, dimension(dimension_ps) ps_w_g
Definition: ps_mod.f:53
double precision, dimension(dimension_ps, dim_m) ps_t_s
Definition: ps_mod.f:80
double precision, dimension(dimension_ps) ps_x_e
Definition: ps_mod.f:33
subroutine calc_ps_vel_mag(VEL_MAG, lU, lV, lW)
Definition: set_ps.f:205
integer numpes
Definition: compar_mod.f:24
double precision, dimension(dimension_ps) ps_x_w
Definition: ps_mod.f:32
double precision, dimension(dimension_ps) ps_volume
Definition: ps_mod.f:84
integer pe_io
Definition: compar_mod.f:30
Definition: ic_mod.f:9
integer, dimension(dimension_ps) ps_k_b
Definition: ps_mod.f:44
double precision, dimension(dimension_ps, dim_m) ps_u_s
Definition: ps_mod.f:69
double precision, dimension(dimension_ps, dim_m) ps_cpxmflow_s
Definition: ps_mod.f:81
subroutine mfix_exit(myID, normal_termination)
Definition: exit.f:5
integer mmax
Definition: physprop_mod.f:19
logical, dimension(:,:,:), allocatable dead_cell_at
Definition: compar_mod.f:127
double precision, parameter small_number
Definition: param1_mod.f:24
Definition: exit.f:2
pure double precision function calc_cpor(T, M, N)
subroutine read_database0()
double precision, dimension(dimension_ps) ps_y_s
Definition: ps_mod.f:34
integer, dimension(dimension_ps) ps_k_t
Definition: ps_mod.f:45
Definition: run_mod.f:13
double precision, dimension(dimension_ps, dim_n_g) ps_x_g
Definition: ps_mod.f:59
Definition: param_mod.f:2
integer, parameter dimension_ps
Definition: param_mod.f:65
Definition: usr_mod.f:1
logical database_read
Definition: physprop_mod.f:133
character(len=16) units
Definition: run_mod.f:30
subroutine debug_ps(lPSV, lPS_SIZE)
Definition: set_ps.f:247
integer, dimension(0:dim_m) nmax
Definition: physprop_mod.f:119
logical do_k
Definition: geometry_mod.f:30
integer mype
Definition: compar_mod.f:24
logical energy_eq
Definition: run_mod.f:100
double precision, dimension(dim_m, dim_n_s) mw_s
Definition: physprop_mod.f:127
subroutine calc_ps_cpxmflow(CpxMFLOW, PS_MFLOW, PS_T, PS_X, lM, Cp0, lDIM_N, lMW)
Definition: set_ps.f:151
double precision, dimension(dimension_ps, dim_m) ps_massflow_s
Definition: ps_mod.f:66
integer, parameter dim_n_s
Definition: param_mod.f:71
double precision, dimension(dimension_ps) ps_z_t
Definition: ps_mod.f:37
double precision, dimension(dimension_ps, dim_m) ps_w_s
Definition: ps_mod.f:71
double precision, dimension(dimension_ps, dim_m, dim_n_s) ps_x_s
Definition: ps_mod.f:77
Definition: ps_mod.f:22
integer, dimension(:), allocatable flag
Definition: geometry_mod.f:99
logical point_source
Definition: ps_mod.f:27
double precision, dimension(dimension_ps) ps_u_g
Definition: ps_mod.f:51
integer, dimension(dimension_ps) ps_j_s
Definition: ps_mod.f:42
character(len=32), dimension(dim_m, dim_n_s) species_alias_s
Definition: rxns_mod.f:52
double precision, dimension(:), allocatable vol
Definition: geometry_mod.f:212
integer, dimension(dimension_ps) ps_i_e
Definition: ps_mod.f:41
double precision, parameter gas_const_cal
Definition: constant_mod.f:155
double precision, parameter zero
Definition: param1_mod.f:27
Definition: bc_mod.f:23