File: N:\mfix\model\des\cfwallcontact.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
2     !
3     !  Subroutine: CFWALLCONTACT(WALL, L, WALLCONTACT)
4     !  Purpose: Check if particle L is in contact with WALL.  If so, set
5     !           WALLCONTACT to 1, else WALLCONTACT is 0
6     !
7     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8     
9           SUBROUTINE CFWALLCONTACT(WALL, L, WALLCONTACT)
10     
11     !-----------------------------------------------
12     ! Modules
13     !-----------------------------------------------
14           USE param1
15           USE constant
16           USE parallel
17           USE compar
18           Use discretelement
19           USE des_bc
20           use geometry, only: DO_K
21           IMPLICIT NONE
22     !-----------------------------------------------
23     ! Dummy arguments
24     !-----------------------------------------------
25     ! Given wall ID number (1=west, 2=east, 3=south, 4=north, 5=bottom,
26     ! 6=top)
27           INTEGER, INTENT (IN) :: WALL
28     ! Given particle ID number
29           INTEGER, INTENT (IN) :: L
30     ! Flag to indicate whether given particle is in contact with given wall
31     ! (1=contact, 0 = no contact)
32           INTEGER, INTENT (INOUT) :: WALLCONTACT
33     !-----------------------------------------------
34     ! Local variables
35     !-----------------------------------------------
36     ! local variables for x, y, z position of the particle
37           DOUBLE PRECISION :: XPOS, YPOS, ZPOS
38     ! local variables to define system dimensions
39           DOUBLE PRECISION :: LXE, LXW, LYN, LYS, LZT, LZB
40     ! local variables: distance between particle surface and wall
41           DOUBLE PRECISION :: DistApart
42     !-----------------------------------------------
43     
44     ! assign temporary local variables for quick reference
45           LXE = EX2
46           LXW = WX1
47           LYN = TY2
48           LYS = BY1
49           LZT = NZ2
50           LZB = SZ1
51     
52     ! assign temporary local variables for manipulation/use
53           XPOS = DES_POS_NEW(L,1)
54           YPOS = DES_POS_NEW(L,2)
55           IF(DO_K) ZPOS = DES_POS_NEW(L,3)
56     
57     
58     ! initialize
59           WALLCONTACT = 0
60     
61           IF (DES_LE_BC) THEN
62     ! Current implementation of Lees & Edwards boundaries implies all other
63     ! boundaries are periodic (i.e. no walls in system)
64              RETURN
65           ELSEIF (DES_PERIODIC_WALLS) THEN
66     ! Check if current wall corresponds to a periodic boundary (i.e. no wall)
67              IF( (DES_PERIODIC_WALLS_X .AND. (WALL.EQ.1.OR.WALL.EQ.2)).OR.&
68                  (DES_PERIODIC_WALLS_Y .AND. (WALL.EQ.3.OR.WALL.EQ.4)).OR.&
69                  (DO_K.AND.DES_PERIODIC_WALLS_Z .AND. &
70                  (WALL.EQ.5.OR.WALL.EQ.6)) ) THEN
71                 RETURN
72              ENDIF
73           ENDIF
74     
75     ! Note that if no cohesion is used WALL_VDW_OUTER_CUTOFF = zero.
76     ! west wall (X)
77           IF(WALL.EQ.1) THEN
78              DistApart = XPOS-LXW-DES_RADIUS(L)
79     ! consider wall contact calculations for particle wall distances less
80     ! than the cutoff
81              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
82     
83     ! east wall (X)
84           ELSEIF(WALL.EQ.2) THEN
85              DistApart = LXE-XPOS-DES_RADIUS(L)
86              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
87     
88     ! south wall (Y)
89           ELSEIF(WALL.EQ.3) THEN
90              DistApart = YPOS-(LYS)-DES_RADIUS(L)
91              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
92     
93     ! north wall (Y)
94           ELSEIF(WALL.EQ.4) THEN
95              DistApart = LYN-YPOS-DES_RADIUS(L)
96              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
97     
98     ! bottom wall (Z)
99           ELSEIF(WALL.EQ.5) THEN
100              DistApart = ZPOS-LZB-DES_RADIUS(L)
101              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
102     
103     ! top wall (Z)
104           ELSEIF(WALL.EQ.6) THEN
105              DistApart = LZT-ZPOS-DES_RADIUS(L)
106              IF( DistApart <= WALL_VDW_OUTER_CUTOFF ) WALLCONTACT = 1
107           ENDIF
108     
109           RETURN
110           END SUBROUTINE CFWALLCONTACT
111