34 . NPARG,NGROUP,NUMELS,NUMELQ,NUMELTG,NUMNOD,NSURF,N2D,
35 . LEADING_DIMENSION,NB_CELL_X,NB_CELL_Y,NB_CELL_Z,NB_BOX_LIMIT,
36 . IPARG,IXS,IXQ,IXTG,X,ID_SURFACE,
37 . CELL,CELL_POSITION,NODAL_PHASE,CLOSEST_NODE_ID,
38 . NNOD2SURF,KNOD2SURF,INOD2SURF,
39 . NOD_NORMAL,NSEG_USED,SEGTOSURF,NSEG,SURF_ELTYP,SURFACE_NODES,SWIFTSURF)
61 use element_mod ,
only :nixs,nixq,nixtg
65#include "implicit_f.inc"
69 INTEGER,
INTENT(IN) :: NPARG,NGROUP,NUMELS,NUMELQ,NUMELTG,NUMNOD,NSURF,N2D
70 INTEGER,
INTENT(IN) :: LEADING_DIMENSION
71 INTEGER,
INTENT(IN) :: NB_BOX_LIMIT
72 INTEGER,
INTENT(IN) :: NB_CELL_X,NB_CELL_Y,NB_CELL_Z
73 INTEGER,
DIMENSION(NPARG,NGROUP),
INTENT(IN) ::
74 INTEGER,
DIMENSION(NIXS,NUMELS),
INTENT(IN),
TARGET :: IXS
75 INTEGER,
DIMENSION(NIXQ,NUMELQ),
INTENT(IN),
TARGET :: IXQ
76 INTEGER,
DIMENSION(NIXTG,NUMELTG),
INTENT(IN),
TARGET :: IXTG
77 INTEGER,
DIMENSION(NUMNOD),
INTENT(INOUT) :: NODAL_PHASE
78 INTEGER,
DIMENSION(NUMNOD),
INTENT(INOUT) :: CLOSEST_NODE_ID
79 INTEGER,
DIMENSION(3,NUMNOD),
INTENT(IN) :: CELL_POSITION
80 INTEGER,
DIMENSION(NB_CELL_X,NB_CELL_Y,NB_CELL_Z),
INTENT(INOUT) :: CELL
81 my_real,
DIMENSION(3,NUMNOD),
INTENT(IN) :: x
82 INTEGER,
INTENT(IN) :: ID_SURFACE
83 INTEGER,
DIMENSION(NSEG,4),
INTENT(IN) :: SURFACE_NODES
84 INTEGER,
INTENT(IN) :: NNOD2SURF,NSEG_USED
85 INTEGER,
DIMENSION(NUMNOD+1),
INTENT(IN) :: KNOD2SURF
86 INTEGER,
DIMENSION(NNOD2SURF,NUMNOD),
INTENT(IN) :: INOD2SURF
87 my_real,
DIMENSION(3,NUMNOD),
INTENT(IN) :: nod_normal
88 INTEGER,
DIMENSION(NSEG_USED),
INTENT(IN) :: SEGTOSURF
89 INTEGER,
INTENT(IN) :: NSEG
90 INTEGER,
DIMENSION(NSEG),
INTENT(IN) :: SURF_ELTYP
91 INTEGER,
DIMENSION(NSURF),
INTENT(IN) :: SWIFTSURF
95 LOGICAL :: BOOL,CONDITION
97 INTEGER :: MTN,NEL,NFT,ITY,ISOLNOD,INIVOL
98 INTEGER :: INOD,NODE_NUMBER,FIRST,SURF_NODE_NUMBER,NODE_ID,CLOSEST_NODE
99 INTEGER,
DIMENSION(:,:),
POINTER :: IXP
100 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAG_ARRAY,SURF_NODE_LIST
102 INTEGER :: IX,IY,IZ,NEXT_NODE
103 INTEGER :: MY_PHASE,OLD_PHASE
104 INTEGER :: UNKNOWN_CELL_INDEX,LAST_UNKNOWN_CELL,CURRENT_UNKNOWN_CELL
105 INTEGER,
DIMENSION(8,3) :: POSITION_SAVE
110 INTEGER,
DIMENSION(:),
ALLOCATABLE :: KEY1,KEY2,ID_LIST
111 my_real,
DIMENSION(:),
ALLOCATABLE :: x_tmp
113 my_real,
DIMENSION(:,:),
ALLOCATABLE :: local_x
114 INTEGER,
DIMENSION(:),
ALLOCATABLE:: LIST_NODE
115 INTEGER,
DIMENSION(32) :: ID_NODE_SAVE
116 integer,
target :: nothing(1,1)
118 ALLOCATE( tag_array(numnod) )
119 ALLOCATE( surf_node_list(numnod) )
120 ALLOCATE( list_node(numnod) )
121 tag_array(1:numnod) = 0
130 node_id = surface_nodes(i,j)
131 IF(tag_array(node_id) == 0)
THEN
132 tag_array(node_id) = 1
133 surf_node_number = surf_node_number + 1
134 surf_node_list(surf_node_number) = node_id
139 ALLOCATE( x_tmp(surf_node_number) )
140 ALLOCATE( key2(surf_node_number
141 DO i=1,surf_node_number
142 x_tmp(i) = x(leading_dimension,surf_node_list(i))
147 CALL myqsort(surf_node_number,x_tmp,key2,info)
151 tag_array(1:numnod) = 0
153 ALLOCATE( local_x(3,8) )
162 isolnod = iparg(28,ng)
163 inivol = iparg(53,ng)
164 IF(inivol <= 0) cycle
165 IF(mtn /= 51 .AND. mtn /= 151) cycle
166 IF(n2d == 0 .AND. ity /= 1)
THEN
168 ELSEIF(n2d > 0 .AND. ity /= 7 .AND. ity /= 2)
THEN
176 ixp => ixs(1:node_number+1,nft+1:nft+nel)
177 ELSEIF(ity == 2)
THEN
180 ixp => ixq(1:node_number+1,nft+1:nft+nel)
181 ELSEIF(ity == 7)
THEN
184 ixp => ixtg(1:node_number+1,nft+1:nft+nel)
187 node_number = -huge(node_number)
200 unknown_cell_index = 0
201 position_save(1:node_number,1:3) = 0
202 last_unknown_cell = 0
208 ix = cell_position(1,node_id)
209 iy = cell_position(2,node_id)
210 iz = cell_position(3,node_id)
213 IF(cell(ix,iy,iz)==2)
THEN
218 ELSEIF(cell(ix,iy,iz) == 1 .OR. cell(ix,iy,iz) == -1)
THEN
220 my_phase = cell(ix,iy,iz)
223 ELSEIF(cell(ix,iy,iz) == 0)
THEN
224 current_unknown_cell = ix + 1000 * iy + 1000**2 * iz
226 unknown_cell_index = unknown_cell_index + 1
227 position_save(unknown_cell_index,1) = ix
228 position_save(unknown_cell_index,2) = iy
229 position_save(unknown_cell_index,3) = iz
230 last_unknown_cell = current_unknown_cell
231 id_node_save(unknown_cell_index) = node_id
236 IF( i > node_number ) condition = .false.
247 IF(tag_array(node_id) == 0)
THEN
248 tag_array(node_id) = 1
249 next_node = next_node + 1
250 list_node(next_node) = node_id
261 IF(my_phase /= 0)
THEN
264 nodal_phase(node_id) = my_phase
266 DO i=1,unknown_cell_index
267 ix = position_save(i,1)
268 iy = position_save(i,2)
269 iz = position_save(i,3)
270 cell(ix,iy,iz) = my_phase
277 ALLOCATE( id_list(unknown_cell_index) )
278 ALLOCATE( key1(unknown_cell_index) )
279 DO i=1,unknown_cell_index
280 ix = position_save(i,1)
281 iy = position_save(i,2)
282 iz = position_save(i,3)
283 node_id = id_node_save(i)
284 local_x(1,i) = x(1,node_id)
285 local_x(2,i) = x(2,node_id)
286 local_x(3,i) = x(3,node_id)
290 CALL find_closest_node(leading_dimension,unknown_cell_index,surf_node_number,numnod,
292 . key1,key2,surf_node_list,id_list)
297 DO i=1,unknown_cell_index
299 xn(1:3) = local_x(1:3,i)
301 CALL in_out_side( inod,inod2surf,knod2surf,nnod2surf,x,
302 . xn,dist,nseg,surf_eltyp,nod_normal,
303 . surface_nodes,swiftsurf,id_surface,segtosurf )
304 ix = position_save(i,1)
305 iy = position_save(i,2)
306 iz = position_save(i,3)
308 cell(ix,iy,iz) = my_phase
315 ix = cell_position(1,node_id)
316 iy = cell_position(2,node_id)
317 iz = cell_position(3,node_id)
318 my_phase = cell(ix,iy,iz)
319 nodal_phase(node_id) = my_phase
323 DO i=1,unknown_cell_index
324 ix = position_save(i,1)
325 iy = position_save(i,2)
326 iz = position_save(i,3)
330 DEALLOCATE( id_list )
340 DEALLOCATE( local_x )
346 ALLOCATE( local_x(3,next_node) )
347 ALLOCATE( id_list(next_node) )
348 ALLOCATE( key1(next_node) )
351 node_id = list_node(i)
352 local_x(1:3,i) = x(1:3,node_id)
361 . key1,key2,surf_node_list,id_list)
362 ! --------------------
367 closest_node = id_list(i)
368 node_id = list_node(i)
369 xn(1:3) = local_x(1:3,i)
371 CALL in_out_side( closest_node,inod2surf,knod2surf,nnod2surf,x,
372 . xn,dist,nseg,surf_eltyp,nod_normal,
373 . surface_nodes,swiftsurf,id_surface,segtosurf )
375 nodal_phase(node_id) = my_phase
376 closest_node_id(node_id) = closest_node
383 DEALLOCATE( tag_array )
384 DEALLOCATE( surf_node_list )
385 DEALLOCATE( list_node )
386 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)