33 . NPARG,NGROUP,NUMELS,NUMELQ,NUMELTG,NUMNOD,NSURF,N2D,
34 . LEADING_DIMENSION,NB_CELL_X,NB_CELL_Y,NB_CELL_Z,NB_BOX_LIMIT,
35 . IPARG,IXS,IXQ,IXTG,X,ID_SURFACE,
36 . CELL,CELL_POSITION,NODAL_PHASE,CLOSEST_NODE_ID,
37 . NNOD2SURF,KNOD2SURF,INOD2SURF,
38 . NOD_NORMAL,NSEG_USED,SEGTOSURF,NSEG,SURF_ELTYP,SURFACE_NODES,SWIFTSURF)
63#include "implicit_f.inc"
67 INTEGER,
INTENT(IN) :: NPARG,NGROUP,NUMELS,NUMELQ,NUMELTG,NUMNOD,NSURF,N2D
68 INTEGER,
INTENT(IN) :: LEADING_DIMENSION
69 INTEGER,
INTENT(IN) :: NB_BOX_LIMIT
70 INTEGER,
INTENT(IN) :: NB_CELL_X,NB_CELL_Y,NB_CELL_Z
71 INTEGER,
DIMENSION(NPARG,NGROUP),
INTENT(IN) :: IPARG
72 INTEGER,
DIMENSION(NIXS,NUMELS),
INTENT(IN),
TARGET :: IXS
73 INTEGER,
DIMENSION(NIXQ,NUMELQ),
INTENT(IN),
TARGET :: IXQ
74 INTEGER,
DIMENSION(NIXTG,NUMELTG),
INTENT(IN),
TARGET :: IXTG
75 INTEGER,
DIMENSION(NUMNOD),
INTENT(INOUT) :: NODAL_PHASE
76 INTEGER,
DIMENSION(NUMNOD),
INTENT(INOUT) :: CLOSEST_NODE_ID
77 INTEGER,
DIMENSION(3,NUMNOD),
INTENT(IN) :: CELL_POSITION
78 INTEGER,
DIMENSION(NB_CELL_X,NB_CELL_Y,NB_CELL_Z),
INTENT(INOUT) :: CELL
79 my_real,
DIMENSION(3,NUMNOD),
INTENT(IN) :: x
80 INTEGER,
INTENT(IN) :: ID_SURFACE
81 INTEGER,
DIMENSION(NSEG,4),
INTENT(IN) :: SURFACE_NODES
82 INTEGER,
INTENT(IN) :: NNOD2SURF,NSEG_USED
83 INTEGER,
DIMENSION(NUMNOD+1),
INTENT(IN) :: KNOD2SURF
84 INTEGER,
DIMENSION(NNOD2SURF,NUMNOD),
INTENT(IN) :: INOD2SURF
85 my_real,
DIMENSION(3,NUMNOD),
INTENT(IN) :: nod_normal
86 INTEGER,
DIMENSION(NSEG_USED),
INTENT(IN) :: SEGTOSURF
87 INTEGER,
INTENT(IN) :: NSEG
88 INTEGER,
DIMENSION(NSEG),
INTENT(IN) :: SURF_ELTYP
89 INTEGER,
DIMENSION(NSURF),
INTENT(IN) :: SWIFTSURF
93 LOGICAL :: BOOL,CONDITION
95 INTEGER :: MTN,NEL,NFT,ITY,ISOLNOD,INIVOL
96 INTEGER :: INOD,NODE_NUMBER,,SURF_NODE_NUMBER,NODE_ID,CLOSEST_NODE
97 INTEGER,
DIMENSION(:,:),
POINTER :: IXP
98 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAG_ARRAY,SURF_NODE_LIST
100 INTEGER :: IX,IY,IZ,NEXT_NODE
101 INTEGER :: MY_PHASE,OLD_PHASE
102 INTEGER :: UNKNOWN_CELL_INDEX,LAST_UNKNOWN_CELL,CURRENT_UNKNOWN_CELL
103 INTEGER,
DIMENSION(8,3) :: POSITION_SAVE
108 INTEGER,
DIMENSION(:),
ALLOCATABLE :: KEY1,KEY2,ID_LIST
109 my_real,
DIMENSION(:),
ALLOCATABLE :: x_tmp
111 my_real,
DIMENSION(:,:),
ALLOCATABLE :: local_x
112 INTEGER,
DIMENSION(:),
ALLOCATABLE:: LIST_NODE
113 INTEGER,
DIMENSION(32) :: ID_NODE_SAVE
114 integer,
target :: nothing(1,1)
116 ALLOCATE( tag_array(numnod) )
117 ALLOCATE( surf_node_list(numnod) )
118 ALLOCATE( list_node(numnod) )
119 tag_array(1:numnod) = 0
128 node_id = surface_nodes(i,j)
129 IF(tag_array(node_id) == 0)
THEN
130 tag_array(node_id) = 1
131 surf_node_number = surf_node_number + 1
132 surf_node_list(surf_node_number) = node_id
137 ALLOCATE( x_tmp(surf_node_number) )
138 ALLOCATE( key2(surf_node_number) )
139 DO i=1,surf_node_number
140 x_tmp(i) = x(leading_dimension,surf_node_list(i))
145 CALL myqsort(surf_node_number,x_tmp,key2,info)
149 tag_array(1:numnod) = 0
151 ALLOCATE( local_x(3,8) )
160 isolnod = iparg(28,ng)
161 inivol = iparg(53,ng)
162 IF(inivol <= 0) cycle
163 IF(mtn /= 51 .AND. mtn /= 151) cycle
164 IF(n2d == 0 .AND. ity /= 1)
THEN
166 ELSEIF(n2d > 0 .AND. ity /= 7 .AND. ity /= 2)
THEN
175 ELSEIF(ity == 2)
THEN
178 ixp => ixq(1:node_number+1,nft+1:nft+nel)
182 ixp => ixtg(1:node_number+1,nft+1:nft+nel)
185 node_number = -huge(node_number)
198 unknown_cell_index = 0
199 position_save(1:node_number,1:3) = 0
200 last_unknown_cell = 0
206 ix = cell_position(1,node_id)
207 iy = cell_position(2,node_id)
208 iz = cell_position(3,node_id)
211 IF(cell(ix,iy,iz)==2)
THEN
216 ELSEIF(cell(ix,iy,iz) == 1 .OR. cell(ix,iy,iz) == -1)
THEN
218 my_phase = cell(ix,iy,iz)
221 ELSEIF(cell(ix,iy,iz) == 0)
THEN
222 current_unknown_cell = ix + 1000 * iy + 1000**2 * iz
224 unknown_cell_index = unknown_cell_index + 1
225 position_save(unknown_cell_index,1) = ix
226 position_save(unknown_cell_index,2) = iy
228 last_unknown_cell = current_unknown_cell
229 id_node_save(unknown_cell_index) = node_id
234 IF( i > node_number ) condition = .false.
245 IF(tag_array(node_id) == 0)
THEN
246 tag_array(node_id) = 1
247 next_node = next_node + 1
248 list_node(next_node) = node_id
259 IF(my_phase /= 0)
THEN
262 nodal_phase(node_id) = my_phase
264 DO i=1,unknown_cell_index
265 ix = position_save(i,1)
266 iy = position_save(i,2)
267 iz = position_save(i,3)
268 cell(ix,iy,iz) = my_phase
275 ALLOCATE( id_list(unknown_cell_index) )
276 ALLOCATE( key1(unknown_cell_index) )
277 DO i=1,unknown_cell_index
278 ix = position_save(i,1)
279 iy = position_save(i,2)
280 iz = position_save(i,3)
281 node_id = id_node_save(i)
282 local_x(1,i) = x(1,node_id)
283 local_x(2,i) = x(2,node_id)
284 local_x(3,i) = x(3,node_id)
288 CALL find_closest_node(leading_dimension,unknown_cell_index,surf_node_number,numnod,
290 . key1,key2,surf_node_list,id_list)
295 DO i=1,unknown_cell_index
297 xn(1:3) = local_x(1:3,i)
299 CALL in_out_side( inod,inod2surf,knod2surf,nnod2surf,x,
300 . xn,dist,nseg,surf_eltyp,nod_normal,
301 . surface_nodes,swiftsurf,id_surface
302 ix = position_save(i,1)
303 iy = position_save(i,2)
304 iz = position_save(i,3)
306 cell(ix,iy,iz) = my_phase
313 ix = cell_position(1,node_id)
314 iy = cell_position(2,node_id)
315 iz = cell_position(3,node_id)
316 my_phase = cell(ix,iy,iz)
317 nodal_phase(node_id) = my_phase
321 DO i=1,unknown_cell_index
322 ix = position_save(i,1)
323 iy = position_save(i,2)
324 iz = position_save(i,3)
328 DEALLOCATE( id_list )
338 DEALLOCATE( local_x )
344 ALLOCATE( local_x(3,next_node) )
345 ALLOCATE( id_list(next_node) )
346 ALLOCATE( key1(next_node) )
349 node_id = list_node(i)
350 local_x(1:3,i) = x(1:3,node_id)
359 . key1,key2,surf_node_list,id_list)
365 closest_node = id_list(i)
366 node_id = list_node(i)
367 xn(1:3) = local_x(1:3,i)
369 CALL in_out_side( closest_node,inod2surf,knod2surf,nnod2surf,x,
370 . xn,dist,nseg,surf_eltyp,nod_normal,
371 . surface_nodes,swiftsurf,id_surface,segtosurf )
373 nodal_phase(node_id) = my_phase
374 closest_node_id(node_id) = closest_node
381 DEALLOCATE( tag_array )
382 DEALLOCATE( surf_node_list )
383 DEALLOCATE( list_node )
384 DEALLOCATE( local_x )
subroutine phase_detection(nparg, ngroup, numels, numelq, numeltg, numnod, nsurf, n2d, leading_dimension, nb_cell_x, nb_cell_y, nb_cell_z, nb_box_limit, iparg, ixs, ixq, ixtg, x, id_surface, cell, cell_position, nodal_phase, closest_node_id, nnod2surf, knod2surf, inod2surf, nod_normal, nseg_used, segtosurf, nseg, surf_eltyp, surface_nodes, swiftsurf)