MFIX  2016-1
set_geometry.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2 ! !
3 ! Module name: SET_GEOMETRY !
4 ! Author: M. Syamlal Date: 21-JAN-92 !
5 ! !
6 ! Purpose: Calculate X, X_E, oX, oX_E !
7 ! !
8 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
9  SUBROUTINE set_geometry
10 
11 ! Global Variables:
12 !---------------------------------------------------------------------//
13 ! Domain decomposition and dimensions
14  use geometry, only: dx, xlength, odx, odx_e
15  use geometry, only: dy, odz, odz_t
16  use geometry, only: dz, zlength, ody, ody_n
17  use geometry, only: x, x_e, ox, ox_e, xmin
18  use geometry, only: z, z_t
19 ! Domain indices.
20  use geometry, only: do_i, imin1, imax1, imax2, imax3, imin3, imax
21  use geometry, only: do_j, jmin1, jmax1, jmax2, jmax3, jmin3
22  use geometry, only: do_k, kmin1, kmax1, kmax2, kmax3, kmin3
23 ! Averaging factors.
24  use geometry, only: fx_e, fx_e_bar, fx, fx_bar
25  use geometry, only: fy_n, fy_n_bar
26  use geometry, only: fz_t, fz_t_bar
27 ! Cyclic domain flags.
28  use geometry, only: cyclic
32 ! Flag for cylindrical coordinates.
33  use geometry, only: cylindrical
34 ! For cylindrical_2d simulations
36  use geometry, only: cyl_x, cyl_x_e
37 ! MPI-Domain decompoint and rank flags.
38  use compar, only: nodesi, nodesj, nodesk
39 ! Flag for specificed constant mass flux.
40  use bc, only: flux_g
41 
42 ! Global Parameters:
43 !---------------------------------------------------------------------//
44  use param1, only: zero, half, one, undefined
45 
46 ! Module procedures
47 !---------------------------------------------------------------------//
48  use mpi_utility, only: global_all_sum
49  use error_manager
50  use toleranc
51 
52  IMPLICIT NONE
53 
54 ! Local Variables:
55 !---------------------------------------------------------------------//
56 ! Generic loop indices
57  INTEGER :: I, J, K
58 ! X-direction dimension of U-momentum cell
59  DOUBLE PRECISION :: DX_E
60 ! Y-direction dimension of V-momentum cell
61  DOUBLE PRECISION :: DY_N
62 ! Z-direction dimension of W-momentum cell
63  DOUBLE PRECISION :: DZ_T
64 ! Local variables for cylindrical_2d simulation
65  integer i_cyl_min, i_cyl_max
66  double precision l_ver, l_ab, rrr, ddy
67 !......................................................................!
68 
69 ! Initialize the error manager.
70  CALL init_err_msg("SET_GEOMETRY")
71 
72 ! Allocate geometry arrays.
74 
75 ! Determine the cyclic direction with a specified mass flux
76  cyclic_x_mf = (flux_g /= undefined .AND. cyclic_x_pd)
77  cyclic_y_mf = (flux_g /= undefined .AND. cyclic_y_pd)
78  cyclic_z_mf = (flux_g /= undefined .AND. cyclic_z_pd)
79 
80 ! Force the cyclic flag if cyclic with pressure drop.
81  IF (cyclic_x_pd) cyclic_x = .true.
82  IF (cyclic_y_pd) cyclic_y = .true.
83  IF (cyclic_z_pd) cyclic_z = .true.
84  cyclic = cyclic_x .OR. cyclic_y .OR. cyclic_z
85 
86  IF(cylindrical .AND. compare(zlength,8.d0*atan(one)) .AND. do_k) &
87  cyclic_z = .true.
88 
89  IF(cyclic_x) THEN
90  dx(1) = dx(imax1)
91  dx(imax2) = dx(imin1)
92  IF(nodesi.NE.1) THEN
93  dx(imin3) = dx(imax1-1)
94  dx(imax3) = dx(imin1+1)
95  ENDIF
96  ENDIF
97 
98  IF(cyclic_y) THEN
99  dy(1) = dy(jmax1)
100  dy(jmax2) = dy(jmin1)
101  IF(nodesj.NE.1) THEN
102  dy(jmin3) = dy(jmax1-1)
103  dy(jmax3) = dy(jmin1+1)
104  ENDIF
105  ENDIF
106 
107  IF (cyclic_z) THEN
108  dz(1) = dz(kmax1)
109  dz(kmax2) = dz(kmin1)
110  IF(nodesk.NE.1) THEN
111  dz(kmin3) = dz(kmax1-1)
112  dz(kmax3) = dz(kmin1+1)
113  ENDIF
114  ENDIF
115 
116 
117 ! Initialize the X-axis variables for CYLINDRICAL coordinates.
118  IF(cylindrical) THEN
119  x(imin3:imax3) = undefined
120  x_e(imin3:imax3) = undefined
121  ox(imin3:imax3) = undefined
122  ox_e(imin3:imax3) = undefined
123  odx(imin3:imax3) = undefined
124 
125  IF(xmin == zero) THEN
126  odx(1) = one/dx(1)
127  ox(1) = undefined
128  ox_e(1) = undefined
129  IF (do_i) THEN
130  x(1) = -half*dx(1)
131  x_e(1) = 0.0
132  ELSE
133  x(1) = half*dx(1)
134  x_e(1) = dx(1)
135  ENDIF
136  ELSE
137  IF (do_i) THEN
138  x_e(1) = xmin
139  x(1) = xmin - half*dx(1)
140  ELSE
141  x_e(1) = xmin + dx(1)
142  x(1) = xmin + half*dx(1)
143  ENDIF
144  ox(1) = one/x(1)
145  ox_e(1) = one/x_e(1)
146  odx(1) = one/dx(1)
147  ENDIF
148 
149  IF (do_i) THEN
150  DO i = imin1, imax2
151  x(i) = x(i-1) + (dx(i-1)+dx(i))/2.
152  x_e(i) = x_e(i-1) + dx(i)
153  ox(i) = one/x(i)
154  ox_e(i) = one/x_e(i)
155  odx(i) = one/dx(i)
156  END DO
157  ENDIF
158 
159 ! Initialize the X-axis variables for CARTESIAN coordinates.
160  ELSE
161 
162  x(imin3:imax3) = one
163  x_e(imin3:imax3) = one
164  ox(imin3:imax3) = one
165  ox_e(imin3:imax3) = one
166  odx(imin3:imax3) = one/dx(imin3:imax3)
167 
168 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<<
169 ! Implementation of the 2.5D model by Li et al. CES 123 (2015) 236-246.
170 ! A computational domain of two wedges connected by a thin plate is used.
171 ! The model is invoked by setting CYLINDRICAL_2D to .TRUE.
172 ! The half width of the plate is determined by I_CYL_NUM
173 ! Please refer to the paper for details of the model
174 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<<
175  IF(cylindrical_2d)THEN
176 
177  IF (xmin == zero) THEN
178  IF (do_i) THEN
179  cyl_x(1) = -half*dx(1) -half*xlength
180  cyl_x_e(1) = 0.d0 -half*xlength
181  ELSE
182  cyl_x(1) = half*dx(1) -half*xlength
183  cyl_x_e(1) = dx(1) -half*xlength
184  ENDIF
185  ELSE
186  IF (do_i) THEN
187  cyl_x_e(1) = xmin -half*xlength
188  cyl_x(1) = xmin - half*dx(1) -half*xlength
189  ELSE
190  cyl_x_e(1) = xmin + dx(1) -half*xlength
191  cyl_x(1) = xmin + half*dx(1) -half*xlength
192  ENDIF
193  ENDIF
194 
195  IF (do_i) THEN
196  DO i = imin1, imax2
197  cyl_x(i) = cyl_x(i-1) + (dx(i-1)+dx(i))/2.
198  cyl_x_e(i) = cyl_x_e(i-1) + dx(i)
199  END DO
200 
201  DO i = imin3, imax3
202  cyl_x(i) = cyl_x(i) *2.d0*sin(dz(1)/2.d0)
203  cyl_x_e(i) = cyl_x_e(i) *2.d0*sin(dz(1)/2.d0)
204  cyl_x(i) = abs(cyl_x(i))
205  cyl_x_e(i) = abs(cyl_x_e(i))
206  END DO
207 
208  if(mod(imax,2).eq.1)then ! odd
209  i_cyl_min = (imax+1)/2 + 1 - i_cyl_num
210  i_cyl_max = (imax+1)/2 + 1 + i_cyl_num
211 
212  do i=i_cyl_min, i_cyl_max
213  cyl_x(i)=dx(i)*(i_cyl_num + half) *2.d0*sin(dz(1)/2.d0)
214  enddo
215  do i=i_cyl_min ,i_cyl_max -1
216  cyl_x_e(i)=dx(i)*(i_cyl_num + half) *2.d0*sin(dz(1)/2.d0)
217  enddo
218  else ! even
219  i_cyl_min = (imax)/2 + 2 - i_cyl_num
220  i_cyl_max = (imax)/2 + 1 + i_cyl_num
221 
222  do i=i_cyl_min, i_cyl_max
223  cyl_x(i)=dx(i)* i_cyl_num *2.d0*sin(dz(1)/2.d0)
224  enddo
225  do i=i_cyl_min, i_cyl_max -1
226  cyl_x_e(i)=dx(i)* i_cyl_num *2.d0*sin(dz(1)/2.d0)
227  enddo
228  endif
229 
230 ! To smooth the transition from cylindrical to 2D domain
231 ! Only one or two cells transition are implemented.
232 
233  if(i_cyl_transition .eq. 1)then
234  l_ver=dx(i_cyl_min)*tan(dz(1)/2.0)
235  l_ab = sqrt(l_ver*l_ver + (dx(i_cyl_min-1)+dx(i_cyl_min))**2)
236  rrr = half*l_ab/sin(dz(1)/4.0)
237  ddy = rrr - sqrt(rrr**2 - dx(i_cyl_min)**2)
238 
239  cyl_x_e(i_cyl_min - 1) = cyl_x_e(i_cyl_min) + 2*ddy
240  cyl_x_e(i_cyl_max ) = cyl_x_e(i_cyl_max - 1) + 2*ddy
241  elseif(i_cyl_transition .eq. 2) then
242  l_ver=2.d0*dx(i_cyl_min)*tan(dz(1)/2.0)
243  l_ab = sqrt(l_ver*l_ver + (4.d0*dx(i_cyl_min))**2)
244  rrr = half*l_ab/sin(dz(1)/4.0)
245  ddy = rrr - sqrt(rrr**2 - dx(i_cyl_min)**2)
246 
247  cyl_x_e(i_cyl_min ) = cyl_x_e(i_cyl_min + 1) + 2*ddy
248  cyl_x_e(i_cyl_max - 1) = cyl_x_e(i_cyl_max - 2) + 2*ddy
249 
250  ddy = rrr - sqrt(rrr**2 - (2.d0*dx(i_cyl_min))**2)
251  cyl_x_e(i_cyl_min - 1 ) = cyl_x_e(i_cyl_min + 1) + 2*ddy
252  cyl_x_e(i_cyl_max ) = cyl_x_e(i_cyl_max - 2) + 2*ddy
253 
254  ddy = rrr - sqrt(rrr**2 - (3.d0*dx(i_cyl_min))**2)
255  cyl_x_e(i_cyl_min - 2 ) = cyl_x_e(i_cyl_min + 1) + 2*ddy
256  cyl_x_e(i_cyl_max + 1) = cyl_x_e(i_cyl_max - 2) + 2*ddy
257  else ! no smooth
258 
259  endif
260 
261  do i=i_cyl_min - i_cyl_transition, i_cyl_max + i_cyl_transition
262  cyl_x(i) = half * (cyl_x_e(i-1) + cyl_x_e(i))
263  enddo
264 
265 ! To make sure all locations are positive
266  do i= imin3,imax3
267  cyl_x(i)=abs(cyl_x(i))
268  cyl_x_e(i)=abs(cyl_x_e(i))
269  enddo
270  ENDIF !IF (DO_I)
271  ENDIF !IF(CYLINDRICAL_2D)THEN
272 
273  ENDIF
274 
275 
276 ! Initialize the Y-Axis variables.
277  ody(jmin3:jmax3) = one/dy(jmin3:jmax3)
278 
279 
280 ! Initialize the Z-Axis variables.
281  DO k = 1, kmax3
282  IF (k == 1) THEN
283  z(k) = zero - half*dz(k)
284  z_t(k) = zero
285  IF(nodesk.NE.1) THEN
286  z(k-1) =z_t(k) - half*dz(k-1)
287  z_t(k-1) = z_t(k) - dz(k-1)
288  ENDIF
289  ELSE
290  z(k) = z_t(k-1) + half*dz(k)
291  z_t(k) = z_t(k-1) + dz(k)
292  ENDIF
293  odz(k) = one/dz(k)
294 
295  IF(nodesk.NE.1 .AND. k==1) odz(k-1) = one/dz(k-1)
296  END DO
297 
298 
299  dx_e = half*(dx(1)+dx(imin1))
300  dy_n = half*(dy(1)+dy(jmin1))
301  dz_t = half*(dz(1)+dz(kmin1))
302 
303  odx_e(1) = one/dx_e
304  ody_n(1) = one/dy_n
305  odz_t(1) = one/dz_t
306 
307  fx(1) = half
308  fx_bar(1) = half
309  fx_e(1) = half
310  fx_e_bar(1) = half
311  fy_n(1) = half
312  fy_n_bar(1) = half
313  fz_t(1) = half
314  fz_t_bar(1) = half
315 
316  IF(nodesi.NE.1) odx_e(imin3) = one/dx_e
317  IF(nodesj.NE.1) ody_n(jmin3) = one/dy_n
318  IF(nodesk.NE.1) odz_t(kmin3) = one/dz_t
319 
320  IF(nodesi.NE.1) THEN
321  fx(imin3) = half
322  fx_bar(imin3) = half
323  fx_e(imin3) = half
324  fx_e_bar(imin3) = half
325  ENDIF
326 
327  IF(nodesj.NE.1) THEN
328  fy_n(jmin3) = half
329  fy_n_bar(jmin3) = half
330  ENDIF
331 
332  IF(nodesk.NE.1) THEN
333  fz_t(kmin3) = half
334  fz_t_bar(kmin3) = half
335  ENDIF
336 
337 
338 ! Look at 2 through IMAX1 U-momentum cells
339  IF (do_i) THEN
340  DO i = imin1, imax1
341  dx_e = half*(dx(i+1)+dx(i))
342  odx_e(i) = one/dx_e
343  fx(i) = half
344  fx_bar(i) = one - fx(i)
345  fx_e(i) = dx(i+1)/(dx(i+1)+dx(i))
346  fx_e_bar(i) = one - fx_e(i)
347  END DO
348  ENDIF
349 
350 ! Look at 2 through JMAX1 V-momentum cells
351  IF (do_j) THEN
352  DO j = jmin1, jmax1
353  dy_n = half*(dy(j+1)+dy(j))
354  ody_n(j) = one/dy_n
355  fy_n(j) = dy(j+1)/(dy(j+1)+dy(j))
356  fy_n_bar(j) = one - fy_n(j)
357  END DO
358  ENDIF
359 
360 ! Look at 2 through KMAX1 W-momentum cells
361  IF (do_k) THEN
362  DO k = kmin1, kmax1
363  dz_t = half*(dz(k+1)+dz(k))
364  odz_t(k) = one/dz_t
365  fz_t(k) = dz(k+1)/(dz(k+1)+dz(k))
366  fz_t_bar(k) = one - fz_t(k)
367  END DO
368  ENDIF
369 
370 ! Look at last U-, V-, and W-momentum cells
371  dx_e = dx(imax2)
372  dy_n = dy(jmax2)
373  dz_t = dz(kmax2)
374  odx_e(imax2) = one/dx_e
375  ody_n(jmax2) = one/dy_n
376  odz_t(kmax2) = one/dz_t
377  fx(imax2) = half
378  fx_bar(imax2) = half
379  fx_e(imax2) = half
380  fx_e_bar(imax2) = half
381 
382  fy_n(jmax2) = half
383  fy_n_bar(jmax2) = half
384 
385  fz_t(kmax2) = half
386  fz_t_bar(kmax2) = half
387  fz_t(kmax3) = half
388  fz_t_bar(kmax3) = half
389 
390  odx_e(imax3) = one/dx_e
391  ody_n(jmax3) = one/dy_n
392  odz_t(kmax3) = one/dz_t
393  fx(imax3) = half
394  fx_bar(imax3) = half
395  fx_e(imax3) = half
396  fx_e_bar(imax3) = half
397 
398  fy_n(jmax3) = half
399  fy_n_bar(jmax3) = half
400 
401 
402  IF(cyclic_x) THEN
403  fx_e(1) = fx_e(imax1)
404  fx_e_bar(1) = fx_e_bar(imax1)
405  IF(nodesi.NE.1) THEN
406  fx_e(imin3) = fx_e(imax1-1)
407  fx_e_bar(imin3) = fx_e_bar(imax1-1)
408  ENDIF
409  ENDIF
410  IF (cyclic_y) THEN
411  fy_n(1) = fy_n(jmax1)
412  fy_n_bar(1) = fy_n_bar(jmax1)
413  IF(nodesj.NE.1) THEN
414  fy_n(jmin3) = fy_n(jmax1-1)
415  fy_n_bar(jmin3) = fy_n_bar(jmax1-1)
416  ENDIF
417  ENDIF
418  IF (cyclic_z) THEN
419  fz_t(1) = fz_t(kmax1)
420  fz_t_bar(1) = fz_t_bar(kmax1)
421  IF(nodesk.NE.1) THEN
422  fz_t(kmin3) = fz_t(kmax1-1)
423  fz_t_bar(kmin3) = fz_t_bar(kmax1-1)
424  ENDIF
425  ENDIF
426 
427  CALL finl_err_msg
428 
429  RETURN
430  END SUBROUTINE set_geometry
subroutine allocate_arrays_geometry
double precision, dimension(:), allocatable fx
Definition: geometry_mod.f:187
integer imax2
Definition: geometry_mod.f:61
subroutine finl_err_msg
logical function compare(V1, V2)
Definition: toleranc_mod.f:94
double precision, dimension(:), allocatable ox_e
Definition: geometry_mod.f:143
double precision, dimension(:), allocatable ody
Definition: geometry_mod.f:116
double precision, dimension(:), allocatable odx
Definition: geometry_mod.f:114
integer imax3
Definition: geometry_mod.f:91
double precision, parameter one
Definition: param1_mod.f:29
double precision, dimension(:), allocatable cyl_x
Definition: geometry_mod.f:181
double precision, dimension(:), allocatable cyl_x_e
Definition: geometry_mod.f:183
double precision, dimension(:), allocatable x_e
Definition: geometry_mod.f:134
logical cyclic_z_mf
Definition: geometry_mod.f:165
subroutine set_geometry
Definition: set_geometry.f:10
double precision, dimension(0:dim_j) dy
Definition: geometry_mod.f:70
double precision, dimension(:), allocatable z_t
Definition: geometry_mod.f:136
logical cyclic_z
Definition: geometry_mod.f:153
double precision, parameter undefined
Definition: param1_mod.f:18
double precision, dimension(0:dim_k) dz
Definition: geometry_mod.f:72
integer imin3
Definition: geometry_mod.f:90
logical cyclic_z_pd
Definition: geometry_mod.f:159
integer imax
Definition: geometry_mod.f:47
subroutine init_err_msg(CALLER)
double precision, dimension(:), allocatable ody_n
Definition: geometry_mod.f:123
double precision, dimension(:), allocatable fz_t
Definition: geometry_mod.f:201
integer i_cyl_num
Definition: geometry_mod.f:176
double precision, dimension(:), allocatable fx_e_bar
Definition: geometry_mod.f:193
integer kmax1
Definition: geometry_mod.f:58
double precision, dimension(:), allocatable fx_e
Definition: geometry_mod.f:191
double precision, dimension(:), allocatable odx_e
Definition: geometry_mod.f:121
logical cyclic_y_pd
Definition: geometry_mod.f:157
integer imax1
Definition: geometry_mod.f:54
integer jmax2
Definition: geometry_mod.f:63
double precision, dimension(:), allocatable ox
Definition: geometry_mod.f:140
logical cyclic_y
Definition: geometry_mod.f:151
integer jmax3
Definition: geometry_mod.f:91
double precision, dimension(0:dim_i) dx
Definition: geometry_mod.f:68
logical do_j
Definition: geometry_mod.f:26
integer kmax2
Definition: geometry_mod.f:65
logical cyclic_y_mf
Definition: geometry_mod.f:163
double precision xlength
Definition: geometry_mod.f:33
double precision, parameter half
Definition: param1_mod.f:28
integer jmax1
Definition: geometry_mod.f:56
logical cyclic_x
Definition: geometry_mod.f:149
logical cyclic_x_mf
Definition: geometry_mod.f:161
integer jmin3
Definition: geometry_mod.f:90
integer jmin1
Definition: geometry_mod.f:42
integer kmax3
Definition: geometry_mod.f:91
logical do_k
Definition: geometry_mod.f:30
logical cyclic_x_pd
Definition: geometry_mod.f:155
double precision, dimension(:), allocatable odz
Definition: geometry_mod.f:118
logical cylindrical
Definition: geometry_mod.f:168
integer nodesj
Definition: compar_mod.f:37
double precision, dimension(:), allocatable fy_n
Definition: geometry_mod.f:196
integer kmin3
Definition: geometry_mod.f:90
integer nodesk
Definition: compar_mod.f:37
double precision xmin
Definition: geometry_mod.f:75
logical cyclic
Definition: geometry_mod.f:147
double precision flux_g
Definition: bc_mod.f:283
integer nodesi
Definition: compar_mod.f:37
logical do_i
Definition: geometry_mod.f:22
double precision, dimension(:), allocatable z
Definition: geometry_mod.f:131
integer imin1
Definition: geometry_mod.f:40
integer i_cyl_transition
Definition: geometry_mod.f:179
double precision, dimension(:), allocatable fx_bar
Definition: geometry_mod.f:189
double precision, dimension(:), allocatable odz_t
Definition: geometry_mod.f:125
logical cylindrical_2d
Definition: geometry_mod.f:173
integer kmin1
Definition: geometry_mod.f:44
double precision, dimension(:), allocatable fz_t_bar
Definition: geometry_mod.f:203
double precision, dimension(:), allocatable x
Definition: geometry_mod.f:129
double precision, parameter zero
Definition: param1_mod.f:27
double precision zlength
Definition: geometry_mod.f:37
double precision, dimension(:), allocatable fy_n_bar
Definition: geometry_mod.f:198
Definition: bc_mod.f:23