35
36
37
38
39
40
41! - loop over
the surface
42
43! - compute
the node
's position (ix,iy,iz) in the cell
44! - color the cell (ix,iy,iz) & all the cells crossed by a segment of the surface
45! - the position of ALE nodes in the grid are computed
46!$ENDCOMMENT
47 USE ARRAY_MOD
48 USE INIVOL_DEF_MOD , only : inivol_struct_
49 USE GROUPDEF_MOD , only : surf_
50
51
52
53#include "implicit_f.inc"
54
55
56
57 INTEGER,INTENT(IN) :: NSURF,NUMNOD
58 INTEGER, INTENT(IN) :: NB_CELL_X,NB_CELL_Y,NB_CELL_Z ! number of cell in x/y/z direction
59 INTEGER, INTENT(IN) :: SURFACE_NUMBER ! number of surface
60 TYPE(array_type), DIMENSION(SURFACE_NUMBER), INTENT(INOUT) :: CELL ! voxcell
61 my_real, DIMENSION(6), INTENT(IN) :: MIN_MAX_POSITION ! min/max position
62 my_real, DIMENSION(3,NUMNOD), INTENT(IN) :: X ! position
63 INTEGER, DIMENSION(3,NUMNOD), INTENT(INOUT) :: CELL_POSITION ! position of node/cell
64 TYPE (SURF_), DIMENSION(NSURF), INTENT(IN) :: IGRSURF ! surface data
65 TYPE (INIVOL_STRUCT_), INTENT(IN) :: INIVOL ! inivol data
66 INTEGER, INTENT(IN) :: ALE_NODE_NUMBER ! number of ale node
67 INTEGER, DIMENSION(ALE_NODE_NUMBER), INTENT(IN) :: LIST_ALE_NODE ! list of ale node
68
69
70
71 INTEGER :: I,J,K
72 INTEGER :: II,JJ,KK
73 INTEGER, DIMENSION(5) :: IX,IY,IZ
74 INTEGER :: SURFACE_ID,SURFACE_NODE_NUMBER,SURFACE_TYPE
75 INTEGER, DIMENSION(4) :: NODE_ID
76 INTEGER :: LOW_X,UP_X
77 INTEGER :: LOW_Y,UP_Y
78 INTEGER :: LOW_Z,UP_Z
79 my_real :: XMIN,YMIN,ZMIN
80 my_real :: XMAX,YMAX,ZMAX
81
82
83 ! ------------------
84 XMAX = MIN_MAX_POSITION(4)
85 XMIN = MIN_MAX_POSITION(1)
86 YMAX = MIN_MAX_POSITION(5)
87 YMIN = MIN_MAX_POSITION(2)
88 ZMAX = MIN_MAX_POSITION(6)
89 ZMIN = MIN_MAX_POSITION(3)
90 ! ------------------
91
92 ! ------------------
93 ! loop over the surface
94 DO I=1,SURFACE_NUMBER
95 ! ------------------
96 ! allocation of CELL array
97 CELL(I)%SIZE_INT_ARRAY_3D(1) = NB_CELL_X
98 CELL(I)%SIZE_INT_ARRAY_3D(2) = NB_CELL_Y
99 CELL(I)%SIZE_INT_ARRAY_3D(3) = NB_CELL_Z
100 CALL ALLOC_3D_ARRAY(CELL(I))
101 CELL(I)%INT_ARRAY_3D(1:NB_CELL_X,1:NB_CELL_Y,1:NB_CELL_Z) = 0
102 ! ------------------
103
104 ! ------------------
105 SURFACE_ID = INIVOL%CONTAINER(I)%SURF_ID ! surface id
106 SURFACE_NODE_NUMBER = IGRSURF(SURFACE_ID)%NSEG ! number of segment of the surface
107 SURFACE_TYPE = IGRSURF(SURFACE_ID)%TYPE ! type of surface
108.AND. IF(SURFACE_TYPE/=200SURFACE_TYPE/=101) THEN
109 DO K=1,SURFACE_NODE_NUMBER
110 ! ------------------
111 ! load the positions of the 4 nodes of the surface K
112 DO J=1,4
113 NODE_ID(J) = IGRSURF(SURFACE_ID)%NODES(K,J) ! node id
114 IX(J)=MAX(1,1+INT(NB_CELL_X*(X(1,NODE_ID(J))-XMIN)/(XMAX-XMIN)))
115 IY(J)=MAX(1,1+INT(NB_CELL_Y*(X(2,NODE_ID(J))-YMIN)/(YMAX-YMIN)))
116 IZ(J)=MAX(1,1+INT(NB_CELL_Z*(X(3,NODE_ID(J))-ZMIN)/(ZMAX-ZMIN)))
117 ENDDO
118 IX(5) = IX(1)
119 IY(5) = IY(1)
120 IZ(5) = IZ(1)
121 ! ------------------
122 ! tag the cells crossed by the segments of the surface K
123 ! 1 2 3
124 ! * ----- * ----- * ----- *
125 ! | o_____|__o | |
126 ! a | \ | | | | a1,b1,c1,a2,b2 are coloured
127 ! * --\-- * -o--- * ----- *
128 ! | \ | / | |
129 ! b | \ |/ | |
130 ! * -----o* ----- * ----- *
131 ! | | | |
132 ! c | | | |
133 ! * ----- * ----- * ----- *
134
135 LOW_X = NB_CELL_X + 1
136 UP_X = -1
137 LOW_Y = NB_CELL_Y + 1
138 UP_Y = -1
139 LOW_Z = NB_CELL_Z + 1
140 UP_Z = -1
141 DO J=1,4
142 LOW_Z = MIN(LOW_Z,IZ(J))
143 UP_Z = MAX(UP_Z,IZ(J+1))
144 LOW_Y = MIN(LOW_Y,IY(J))
145 UP_Y = MAX(UP_Y,IY(J+1))
146 LOW_X = MIN(LOW_X,IX(J))
147 UP_X = MAX(UP_X,IX(J+1))
148 ENDDO
149 LOW_Z = MAX(1,LOW_Z)
150 UP_Z = MIN(NB_CELL_Z,UP_Z)
151 LOW_Y = MAX(1,LOW_Y)
152 UP_Y = MIN(NB_CELL_Y,UP_Y)
153 LOW_X = MAX(1,LOW_X)
154 UP_X = MIN(NB_CELL_X,UP_X)
155 ! ------------------
156 DO KK=LOW_Z,UP_Z
157 DO JJ=LOW_Y,UP_Y
158 DO II=LOW_X,UP_X
159 ! ------------------
160 ! the cell (ii,jj,kk) contains a node of a surface or is crossed by the segment
161 IF(CELL(I)%INT_ARRAY_3D(II,JJ,KK)/=2) THEN
162 CELL(I)%INT_ARRAY_3D(II,JJ,KK) = 2
163 ENDIF
164 ! ------------------
165 ENDDO
166 ENDDO
167 ENDDO
168 ! ------------------
169 ENDDO
170 ! ------------------
171 ENDIF
172 ENDDO
173 ! ------------------
174
175 ! ------------------
176 ! compute the position of ALE nodes in grid
177 DO J=1,ALE_NODE_NUMBER
178 I = LIST_ALE_NODE(J)
179 CELL_POSITION(1,I) =MAX(1,1+INT(NB_CELL_X*(X(1,I)-XMIN)/(XMAX-XMIN)))
180 CELL_POSITION(2,I) =MAX(1,1+INT(NB_CELL_Y*(X(2,I)-YMIN)/(YMAX-YMIN)))
181 CELL_POSITION(3,I) =MAX(1,1+INT(NB_CELL_Z*(X(3,I)-ZMIN)/(ZMAX-ZMIN)))
182
183 ! ensure that cell_position does not exceed the number of
184 ! cell (single precision issue)
185 CELL_POSITION(1,I) =MIN(CELL_POSITION(1,I),NB_CELL_X)
186 CELL_POSITION(2,I) =MIN(CELL_POSITION(2,I),NB_CELL_Y)
187 CELL_POSITION(3,I) =MIN(CELL_POSITION(3,I),NB_CELL_Z)
188 ENDDO
189 ! ------------------
190
191 RETURN
end diagonal values have been computed in the(sparse) matrix id.SOL