33
34
35
36
37
38
39
40
41
42
43
44
45 use element_mod , only :nixs,nixq,nixtg
46
47
48
49#include "implicit_f.inc"
50
51
52
53#include "mvsiz_p.inc"
54
55
56
57 INTEGER,INTENT(IN) :: NPARG, NGROUP, NUMELS,NUMELTG,NUMELQ,NUMNOD,N2D
58 INTEGER, INTENT(INOUT) :: ALE_ELEMENT_NUMBER
59 INTEGER, INTENT(INOUT) :: ALE_NODE_NUMBER
60 INTEGER, DIMENSION(NUMNOD), INTENT(INOUT) :: LIST_ALE_NODE
61 INTEGER, DIMENSION(NPARG,NGROUP), INTENT(IN) :: IPARG
62 INTEGER, DIMENSION(NIXS,NUMELS),INTENT(IN), TARGET :: IXS
63 INTEGER, DIMENSION(NIXQ,NUMELQ),INTENT(IN), TARGET :: IXQ
64 INTEGER, DIMENSION(NIXTG,NUMELTG),INTENT(IN), TARGET :: IXTG
65 my_real,
INTENT(INOUT) :: element_size
66 my_real,
DIMENSION(6),
INTENT(INOUT) :: min_max_position
67 my_real,
DIMENSION(3,NUMNOD),
INTENT(IN) :: x
68
69
70
71 INTEGER :: I,J,K,NG
72 INTEGER :: MTN,NEL,NFT,ITY,ISOLNOD,INIVOL
73 INTEGER :: NODE_NUMBER,FIRST
74 INTEGER, DIMENSION(:,:), POINTER :: IX
75 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG_ARRAY
77 my_real,
DIMENSION(3) :: max_node,min_node,distance
78 integer, target :: nothing(1,1)
79
80 ALLOCATE(tag_array(numnod))
81 tag_array(1:numnod) = 0
82 ix => nothing
83 element_size = -one
84 min_max_position(1:3) = ep30
85 min_max_position(4:6) = -ep30
86 ale_element_number = 0
87 ale_node_number = 0
88
89
90 DO ng=1,ngroup
91 mtn = iparg(1,ng)
92 nel = iparg(2,ng)
93 nft = iparg(3,ng)
94 ity = iparg(5,ng)
95 isolnod = iparg(28,ng)
96 inivol = iparg(53,ng)
97 IF(inivol <= 0) cycle
98 IF(mtn /= 51 .AND. mtn /= 151) cycle
99 IF(n2d == 0 .AND. ity /= 1)THEN
100 cycle
101 ELSEIF(n2d > 0 .AND. ity/=7 .AND. ity /= 2)THEN
102 cycle
103 ENDIF
104
105 ale_element_number = ale_element_number + nel
106
107
108
109 IF(ity == 1) THEN
110 first = 1
111 node_number = 8
112 ix => ixs(1:node_number+1,nft+1:nft+nel)
113 ELSEIF(ity == 2) THEN
114 first = 2
115 node_number = 4
116 ix => ixq(1:node_number+1,nft+1:nft+nel)
117 ELSEIF(ity == 7) THEN
118 first = 2
119 node_number = 3
120 ix => ixtg(1:node_number+1,nft+1:nft+nel)
121 ELSE
122 first = -huge(first)
123 node_number = -huge(node_number)
124 ix => null()
125 ENDIF
126
127
128
129
130
131 DO j=1,nel
132 max_node(1:3) = -ep20
133 min_node(1:3) = ep20
134
135
136 DO i=1,node_number
137 max_node(first:3) =
max(max_node(first:3),x(first:3,ix(1+i,j)) )
138 min_node(first:3) =
min(min_node(first:3),x(first:3,ix(1+i,j)) )
139 ENDDO
140 distance(first:3) = (abs(max_node(first:3)-min_node(first:3)))**2
141 local_size = sqrt( sum(distance(first:3)) )
142 element_size =
max(element_size,local_size)
143
144
145
146 DO k=first,3
147
148 DO i=1,node_number
149 min_max_position(k) =
min(min_max_position(k),x(k,ix(1+i,j)))
150 min_max_position(3+k) =
max(min_max_position(3+k),x(k,ix(1+i,j)))
151 IF(tag_array(ix(1+i,j))==0) THEN
152 tag_array(ix(1+i,j)) = 1
153 ale_node_number = ale_node_number + 1
154 list_ale_node(ale_node_number) = ix(1+i,j)
155 ENDIF
156 ENDDO
157 ENDDO
158
159 ENDDO
160 ! ---------------
161 ENDDO
162
163 DEALLOCATE(tag_array)
164
165
166 RETURN