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

1           MODULE cutcell
2     
3           Use param
4           Use param1
5           USE progress_bar
6     
7     !     CUT_CELL.LOG unit number
8           INTEGER  UNIT_CUT_CELL_LOG
9           PARAMETER (UNIT_CUT_CELL_LOG = 111)
10     
11     !     Flag to activate Cartesian grid
12     
13           LOGICAL :: CARTESIAN_GRID
14     
15     !     Flag to activate cell re-indexing
16           LOGICAL :: RE_INDEXING
17     
18     !     Flag to activate adjustment of each processor domain size
19           LOGICAL :: ADJUST_PROC_DOMAIN_SIZE
20     
21     !     Flag to report best domain size on each processor and quit
22           LOGICAL :: REPORT_BEST_DOMAIN_SIZE
23     
24     !     maximum number of cut cells
25           INTEGER :: DIMENSION_MAX_CUT_CELL
26     
27     !     Factor used to allocate cut cells arrays
28           DOUBLE PRECISION :: FAC_DIM_MAX_CUT_CELL
29     
30     !     Flag to identify interior cells.
31     !     This flag is true for any cell within the range
32     !     istart1 <= i <= iend1 and so on for j and k.
33     !     Caution: it is local to each processor and this array
34     !     is not shared accross processor boundaries.
35     !     For example, consider 1-D decomposition over two procs.
36     !     on each proc, INTERIOR_CELL_AT will be true for
37     !     istart1 <= i <= iend1. On processor 1, it will be false
38     !     at i=iend2 even though i=iend2 is an interior cell in the
39     !     global sense!
40           LOGICAL, DIMENSION(:), ALLOCATABLE :: INTERIOR_CELL_AT
41     
42     !     One-Dimensional Arrays for East, North, Top location of
43     !     original (uncut) scalar cells
44           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::XG_E
45           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::YG_N
46           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::ZG_T
47     
48     !     location of U-momentum nodes
49           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_U
50           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_U
51           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_U
52     
53     !     location of V-momentum nodes
54           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_V
55           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_V
56           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_V
57     
58     !     location of W-momentum nodes
59           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_W
60           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_W
61           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_W
62     
63     !     Intersection flags
64           LOGICAL, DIMENSION(:), ALLOCATABLE :: INTERSECT_X
65           LOGICAL, DIMENSION(:), ALLOCATABLE :: INTERSECT_Y
66           LOGICAL, DIMENSION(:), ALLOCATABLE :: INTERSECT_Z
67     
68     !     Location of intersections
69           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_int
70           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_int
71           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_int
72     
73     !     Location of original (uncut) corner cell nodes
74           DOUBLE PRECISION, DIMENSION(0:15):: X_NODE
75           DOUBLE PRECISION, DIMENSION(0:15):: Y_NODE
76           DOUBLE PRECISION, DIMENSION(0:15):: Z_NODE
77           DOUBLE PRECISION, DIMENSION(0:15):: F_NODE
78           INTEGER, DIMENSION(0:15) :: IJK_OF_NODE
79     
80     !     Location of new (along intersecting edges) nodes
81           INTEGER :: NUMBER_OF_NEW_POINTS
82           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_NEW_POINT
83           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_NEW_POINT
84           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_NEW_POINT
85     
86     !     Location of new (along intersecting edges) nodes
87           INTEGER :: NUMBER_OF_NEW_U_POINTS
88           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_NEW_U_POINT
89           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_NEW_U_POINT
90           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_NEW_U_POINT
91     
92     !     Location of new (along intersecting edges) nodes
93           INTEGER :: NUMBER_OF_NEW_V_POINTS
94           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_NEW_V_POINT
95           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_NEW_V_POINT
96           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_NEW_V_POINT
97     
98     !     Location of new (along intersecting edges) nodes
99           INTEGER :: NUMBER_OF_NEW_W_POINTS
100           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_NEW_W_POINT
101           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_NEW_W_POINT
102           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_NEW_W_POINT
103     
104     !     Number of nodes
105           INTEGER, DIMENSION(:), ALLOCATABLE ::  NUMBER_OF_NODES
106           INTEGER, DIMENSION(:), ALLOCATABLE ::  NUMBER_OF_U_NODES
107           INTEGER, DIMENSION(:), ALLOCATABLE ::  NUMBER_OF_V_NODES
108           INTEGER, DIMENSION(:), ALLOCATABLE ::  NUMBER_OF_W_NODES
109     
110     !     Connectivity
111           INTEGER, DIMENSION(:,:), ALLOCATABLE :: CONNECTIVITY
112           INTEGER, DIMENSION(:,:), ALLOCATABLE :: CONNECTIVITY_U
113           INTEGER, DIMENSION(:,:), ALLOCATABLE :: CONNECTIVITY_V
114           INTEGER, DIMENSION(:,:), ALLOCATABLE :: CONNECTIVITY_W
115     
116     !     Processor assign to cell IJK
117           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: PARTITION
118     
119     !     Normal Vector Defining cut face in Scalar Cell
120           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  NORMAL_S
121     
122     !     Reference point Defining cut face in Scalar Cell
123           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  REFP_S
124     
125     !     Flags for Wall momentum cells
126           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  WALL_U_AT
127           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  WALL_V_AT
128           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  WALL_W_AT
129     
130     !     Areas of cut faces
131           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Area_CUT
132           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Area_U_CUT
133           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Area_V_CUT
134           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Area_W_CUT
135     
136     !     Distances from cell center to face center
137           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_Ue
138           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_Uw
139           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Un
140           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Us
141           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Ut
142           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Ub
143     
144           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_Ve
145           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_Vw
146           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Vn
147           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Vs
148           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Vt
149           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Vb
150     
151           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_We
152           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELX_Ww
153           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Wn
154           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELY_Ws
155           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Wt
156           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELZ_Wb
157     
158     !     Location of face centers
159           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_U_ec
160           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_U_ec
161           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_U_ec
162     
163           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_U_nc
164           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_U_nc
165           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_U_nc
166     
167           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_U_tc
168           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_U_tc
169           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_U_tc
170     
171           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_V_ec
172           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_V_ec
173           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_V_ec
174     
175           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_V_nc
176           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_V_nc
177           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_V_nc
178     
179           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_V_tc
180           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_V_tc
181           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_V_tc
182     
183           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_W_ec
184           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_W_ec
185           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_W_ec
186     
187           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_W_nc
188           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_W_nc
189           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_W_nc
190     
191           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X_W_tc
192           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Y_W_tc
193           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Z_W_tc
194     
195     !     Distance to cut face in Scalar Cell
196           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELH_Scalar
197     
198     
199     !     Distance to cut face in U-Momentum Cell
200           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELH_U
201     
202     !     Normal Vector Defining cut face in U-Momentum Cell
203           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  NORMAL_U
204     
205     !     Reference point Defining cut face in W-Momentum Cell
206           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  REFP_U
207     
208     
209     !     Correction factors for U-Momentum Cell
210           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ue
211           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ue_bar
212     
213           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_U_ne
214           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_U_nw
215     
216           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_U_te
217           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_U_tw
218     
219           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Ue_c
220           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_U_E
221     
222           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Un
223           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Un_bar
224     
225           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Un_c
226           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_U_N
227     
228           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ut
229           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ut_bar
230     
231           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Ut_c
232           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_U_T
233     
234           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_UPG_E
235           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_UPG_W
236     
237     !     Distance to cut face in V-Momentum Cell
238           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELH_V
239     
240     !     Normal Vector Defining cut face in V-Momentum Cell
241           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  NORMAL_V
242     
243     !     Reference point Defining cut face in V-Momentum Cell
244           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  REFP_V
245     
246     
247     !     Correction factors for V-Momentum Cell
248           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_V_ne
249           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_V_se
250     
251           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Vn
252           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Vn_bar
253     
254           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_V_nt
255           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_V_st
256     
257           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ve
258           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Ve_bar
259     
260           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Ve_c
261           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_V_E
262     
263           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Vn_c
264           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_V_N
265     
266           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Vt
267           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Vt_bar
268     
269           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Vt_c
270           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_V_T
271     
272           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_VPG_N
273           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_VPG_S
274     
275     
276     !     Distance to cut face in W-Momentum Cell
277           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DELH_W
278     
279     !     Normal Vector Defining cut face in W-Momentum Cell
280           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  NORMAL_W
281     
282     !     Reference point Defining cut face in W-Momentum Cell
283           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::  REFP_W
284     
285     
286     !     Correction factors for W-Momentum Cell
287           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_W_te
288           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_W_be
289     
290           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_W_tn
291           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_W_bn
292     
293           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Wt
294           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Wt_bar
295     
296           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_We
297           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_We_bar
298     
299           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_We_c
300           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_W_E
301     
302           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Wn
303           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Theta_Wn_bar
304     
305           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Wn_c
306           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_W_N
307     
308           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ALPHA_Wt_c
309           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  NOC_W_T
310     
311           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_WPG_T
312           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  A_WPG_B
313     
314     !     1/dx, 1/dy, 1/dz
315           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDX_E_U
316           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDY_N_U
317           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDZ_T_U
318     
319     
320           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDX_E_V
321           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDY_N_V
322           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDZ_T_V
323     
324           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDX_E_W
325           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDY_N_W
326           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  ONEoDZ_T_W
327     
328     
329     
330           LOGICAL, DIMENSION(:), ALLOCATABLE :: ALONG_DOMAIN_BOUNDARY
331     
332     !     Location of intersection points
333           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Xn_int
334           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Xn_U_int
335           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Xn_V_int
336           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Xn_W_int
337     
338           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Ye_int
339           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Ye_U_int
340           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Ye_V_int
341           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Ye_W_int
342     
343           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Zt_int
344           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Zt_U_int
345           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Zt_V_int
346           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  Zt_W_int
347     
348     !     Cut cell treatment flags
349           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_TREATMENT_AT
350           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_U_TREATMENT_AT
351           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_V_TREATMENT_AT
352           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_W_TREATMENT_AT
353     
354     !     Various cell flags
355           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_CELL_AT
356           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_U_CELL_AT
357           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_V_CELL_AT
358           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  CUT_W_CELL_AT
359     
360           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  SMALL_CELL_AT
361           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  BLOCKED_CELL_AT
362           INTEGER,  DIMENSION(:), ALLOCATABLE ::  SMALL_CELL_FLAG
363     
364           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  BLOCKED_U_CELL_AT
365           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  BLOCKED_V_CELL_AT
366           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  BLOCKED_W_CELL_AT
367     
368           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  STANDARD_CELL_AT
369           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  STANDARD_U_CELL_AT
370           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  STANDARD_V_CELL_AT
371           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  STANDARD_W_CELL_AT
372     
373     !     Tolerance for snapping procedure
374           DOUBLE PRECISION, DIMENSION(3) :: TOL_SNAP
375     
376     !     Tolerances for wall distance
377           DOUBLE PRECISION :: TOL_DELH
378     
379     !     Tolerance for merging nodes
380           DOUBLE PRECISION :: TOL_MERGE
381     
382     !     Tolerance for detecting small scalar cells
383           DOUBLE PRECISION :: TOL_SMALL_CELL
384           DOUBLE PRECISION :: TOL_SMALL_AREA
385     !     Maximum value of ALPHA correction factor
386           DOUBLE PRECISION :: ALPHA_MAX
387     
388     !     Flags to include effect of cut cells
389           LOGICAL :: NOC,NOC_UG,NOC_VG,NOC_WG,NOC_US,NOC_VS,NOC_WS,NOC_TRDG,NOC_TRDS
390           LOGICAL :: CUT_TAU_UG,CUT_TAU_VG,CUT_TAU_WG,CUT_TAU_US,CUT_TAU_VS,CUT_TAU_WS
391     
392     !     pressure gradient option flag
393           INTEGER :: PG_OPTION
394     
395     !     Number of cells
396           INTEGER NUMBER_OF_U_CUT_CELLS
397           INTEGER NUMBER_OF_V_CUT_CELLS
398           INTEGER NUMBER_OF_W_CUT_CELLS
399           INTEGER NUMBER_OF_SMALL_CELLS
400     
401           INTEGER NUMBER_OF_U_WALL_CELLS
402           INTEGER NUMBER_OF_V_WALL_CELLS
403           INTEGER NUMBER_OF_W_WALL_CELLS
404     
405     !     Vorticity and lambda2
406           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  VORTICITY
407           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  LAMBDA2
408     
409     !     Re-ordering array
410           INTEGER, DIMENSION(15) :: ORDER
411     
412     !     Snapping flag
413           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  SNAP
414     
415           INTEGER, DIMENSION(10) :: CG_SAFE_MODE
416           LOGICAL :: PRINT_WARNINGS
417           LOGICAL :: SET_CORNER_CELLS
418     
419     !     Master cell of wall cell (FSW)
420           INTEGER,  DIMENSION(:), ALLOCATABLE ::  U_MASTER_OF
421           INTEGER,  DIMENSION(:), ALLOCATABLE ::  V_MASTER_OF
422           INTEGER,  DIMENSION(:), ALLOCATABLE ::  W_MASTER_OF
423     
424           INTEGER :: N_USR_DEF
425     
426           LOGICAL :: USE_POLYGON
427     
428           LOGICAL :: USE_STL
429     
430           LOGICAL :: USE_MSH
431     
432     !     Boundary condition flag
433           INTEGER,  DIMENSION(:), ALLOCATABLE ::  BC_ID
434           INTEGER,  DIMENSION(:), ALLOCATABLE ::  BC_U_ID
435           INTEGER,  DIMENSION(:), ALLOCATABLE ::  BC_V_ID
436           INTEGER,  DIMENSION(:), ALLOCATABLE ::  BC_W_ID
437     
438           INTEGER :: NSW_GHOST_BC_ID
439     
440     !     Under-relaxation flag applied to cut cells
441           DOUBLE PRECISION, DIMENSION(9):: CG_UR_FAC
442     
443     !     Debugging_variables
444           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::DEBUG_CG
445     
446           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::U_g_CC
447           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::V_g_CC
448           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::W_g_CC
449     
450           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::U_s_CC
451           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::V_s_CC
452           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::W_s_CC
453     
454           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  TRD_G_OUT
455           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  PP_G_OUT
456           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  EPP_OUT
457     
458           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  dudx_OUT
459           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  dvdy_OUT
460           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  delv_OUT
461     
462           LOGICAL :: PARTIAL_CHECK_03
463     
464     !     Keep track of whether the CG Hader was printed on screen
465           LOGICAL :: CG_HEADER_WAS_PRINTED = .FALSE.
466     
467           LOGICAL, DIMENSION(:), ALLOCATABLE ::SCALAR_NODE_ATWALL
468     
469           DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::SCALAR_NODE_XYZ
470     
471           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::Ovol_around_node
472     
473     !     Snapping flag
474           LOGICAL,  DIMENSION(:), ALLOCATABLE ::  POTENTIAL_CUT_CELL_AT
475     
476           INTEGER, PARAMETER :: MAX_CP = 100
477     
478           DOUBLE PRECISION, DIMENSION(0:MAX_CP) ::  CPX,CPY,CPZ  ! Control point location
479           DOUBLE PRECISION, DIMENSION(MAX_CP)   ::  ERX,ERY,ERZ  ! Expansion Ratio
480           INTEGER, DIMENSION(MAX_CP)             ::  NCX,NCY,NCZ  ! Number of cell in a segment
481           DOUBLE PRECISION, DIMENSION(MAX_CP)   ::  FIRST_DX,LAST_DX! DX values at segment extremities
482           DOUBLE PRECISION, DIMENSION(MAX_CP)   ::  FIRST_DY,LAST_DY! DY values at segment extremities
483           DOUBLE PRECISION, DIMENSION(MAX_CP)   ::  FIRST_DZ,LAST_DZ! DZ values at segment extremities
484     
485     
486           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  F_AT
487     
488           DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  DWALL
489     ! Grid partition for reporting best size
490           INTEGER :: NODESI_REPORT,NODESJ_REPORT,NODESK_REPORT
491     
492           LOGICAL :: MINIMIZE_SEND_RECV
493     
494           LOGICAL :: DWALL_BRUTE_FORCE
495     
496           END MODULE cutcell
497