34
36
37
38
39#include "implicit_f.inc"
40
41
42
43#include "mvsiz_p.inc"
44#include "comlock.inc"
45
46
47
48#include "com_xfem1.inc"
49
50
51
52 INTEGER JFT,JLT,NFT,ILEV,IXTG(NIXTG,*),ELCUTC(2,*),IEL_CRKTG(*),
53 . IAD_CRKTG(3,*),XEDGE3N(3,*),NODEDGE(2,*)
54 TYPE (XFEM_EDGE_) , DIMENSION(*) ::
55
56
57
58 INTEGER I,J,K,K1,K2,K3,KK,p,P1,P2,P3,IFI1,IFI2,
59 . EDGE,IEDGE1,IEDGE2,EDGE1,EDGE2,IED1,IED2,
60 . IADC1,IADC2,IADC3,ILAY,IXEL,ELCUT,ELCRK,ELCRKTG,
61 . IED0,IFI10,NOD1,NOD2,ITRI,NX1,NX2,NX3
62 INTEGER IFI0(3,MVSIZ),NEG(2),D1(3),D2(3),DX(6)
64 . xin(3,mvsiz),yin(3,mvsiz),zin(3,mvsiz),
65 . xx(3,mvsiz),yy(3,mvsiz),zz(3,mvsiz)
66 my_real x10,y10,z10,x20,y20,z20,beta
67
68 DATA d1/2,3,1/
69 DATA d2/3,1,2/
70 DATA dx/1,2,3,1,2,3/
71
72
73
74
75 ixel = mod(ilev-1, nxel) + 1
76 ilay = (ilev-ixel)/nxel + 1
77 p1 = 0
78 p2 = 0
79 p3 = 0
80
81 DO i=jft,jlt
82 xin(1,i) = zero
83 yin(1,i) = zero
84 zin(1,i) = zero
85 xin(2,i) = zero
86 yin(2,i) = zero
87 zin(2,i) = zero
88 xin(3,i) = zero
89 yin(3,i) = zero
90 zin(3,i) = zero
91 END DO
92
93 DO i=jft,jlt
94 elcrktg = iel_crktg(i+nft)
95 iadc1 = iad_crktg(1,elcrktg)
96 iadc2 = iad_crktg(2,elcrktg)
97 iadc3 = iad_crktg(3,elcrktg)
98
102
103 ifi0(1,i) = isign(1,ifi0(1,i))
104 ifi0(2,i) = isign(1,ifi0(2,i))
105 ifi0(3,i) = isign(1,ifi0(3,i))
106
107
108
109
110 xx(1,i) =
crkavx(ilev)%X(1,iadc1)
111 yy(1,i) =
crkavx(ilev)%X(2,iadc1)
112 zz(1,i) =
crkavx(ilev)%X(3,iadc1)
113
114 xx(2,i) =
crkavx(ilev)%X(1,iadc2)
115 yy(2,i) =
crkavx(ilev)%X(2,iadc2)
116 zz(2,i) =
crkavx(ilev)%X(3,iadc2)
117
118 xx(3,i) =
crkavx(ilev)%X(1,iadc3)
119 yy(3,i) =
crkavx(ilev)%X(2,iadc3)
120 zz(3,i) =
crkavx(ilev)%X(3,iadc3)
121 END DO
122
123
124
125 DO i=jft,jlt
126 elcrktg = iel_crktg(i+nft)
127 elcrk = elcrktg + ecrkxfec
129 IF (elcut /= 0) THEN
130 DO k=1,3
131 ied0 = crkedge(ilay)%IEDGETG(k,elcrktg)
132 IF (ied0 > 0) THEN
133 edge = xedge3n(k,elcrktg)
134 beta = crkedge(ilay)%RATIO(edge)
135 nod1 = nodedge(1,edge)
136 nod2 = nodedge(2,edge)
137 IF (nod1 == ixtg(k+1,i+nft) .and.
138 . nod2 == ixtg(d1(k)+1,i+nft)) THEN
139 p1 = k
140 p2 = d1
141 ELSEIF (nod2 == ixtg(k+1,i+nft).and.
142 . nod1 == ixtg(d1(k)+1,i+nft)) THEN
143 p1 = d1(k)
144 p2 = k
145 ENDIF
146 x10 = xx(p1,i)
147 y10 = yy(p1,i)
148 z10 = zz(p1,i)
149 x20 = xx(p2,i)
150 y20 = yy(p2,i)
151 z20 = zz(p2,i)
152 xin(ied0,i) = x10+beta*(x20-x10)
153 yin(ied0,i) = y10+beta*(y20-y10)
154 zin(ied0,i) = z10+beta*(z20-z10)
155 END IF
156 END DO
157 END IF
158 END DO
159
160
161
162
163
164 DO i=jft,jlt
165 elcrktg = iel_crktg(i+nft)
166 elcrk = elcrktg + ecrkxfec
168
169 IF (elcutc(1,i+nft) == 0) cycle
170 p1 = 0
171 p2 = 0
172 p3 = 0
173 DO k=1,3
174 ifi10 = ifi0(k,i)
175 ifi1 = ifi0(d1(k),i)
176 ifi2 = ifi0(d2(k),i)
177 IF (ifi10*ifi1 < 0 .and. ifi10*ifi2 < 0) THEN
178 p1 = k
179 p2 = d1(k)
180 p3 = d2(k)
181 EXIT
182 END IF
183 END DO
184
185 IF (p1==0 .or. p2==0 .or. p3==0) cycle
186
189 nx2 = dx(nx1+1)
190 nx3 = dx(nx1+2)
191 ied1 = nx1
192 ied2 = nx3
193 iedge1 = crkedge(ilay)%IEDGETG(ied1,elcrktg)
194 iedge2 = crkedge(ilay)%IEDGETG(ied2,elcrktg)
195 edge1 = xedge3n(ied1,elcrktg)
196 edge2 = xedge3n(ied2,elcrktg)
197
198 kk =
crkshell(ilev)%XNODEL(nx1,elcrk)
199 k1 = kk -
crknod(ilev)%CRKNUMNODS * (ilev-1)
200 kk =
crkshell(ilev)%XNODEL(nx2,elcrk)
201 k2 = kk -
crknod(ilev)%CRKNUMNODS * (ilev-1)
202 kk =
crkshell(ilev)%XNODEL(nx3,elcrk)
203 k3 = kk -
crknod(ilev)%CRKNUMNODS * (ilev-1)
204
205 IF (itri < 0) THEN
206
207 IF (ixel == 1) THEN
208
209
210
211
212 crkavx(ilev)%XX(1,k2) = xin(iedge1,i)
213 crkavx(ilev)%XX(2,k2) = yin(iedge1,i)
214 crkavx(ilev)%XX(3,k2) = zin(iedge1,i)
215 crkavx(ilev)%XX(1,k3) = xin(iedge2,i)
216 crkavx(ilev)%XX(2,k3) = yin(iedge2,i)
217 crkavx(ilev)%XX(3,k3) = zin(iedge2,i)
218
219 ELSEIF (ixel == 2) THEN
220
221
222
223
224 crkavx(ilev)%XX(1,k1) = xin(iedge2,i)
225 crkavx(ilev)%XX(2,k1) = yin(iedge2,i)
226 crkavx(ilev)%XX(3,k1) = zin(iedge2,i)
227
228 ELSEIF (ixel == 3) THEN
229
230
231
232 crkavx(ilev)%XX(1,k1) = xin(iedge1,i)
233 crkavx(ilev)%XX(2,k1) = yin(iedge1,i)
234 crkavx(ilev)%XX(3,k1) = zin(iedge1,i)
235
236 crkavx(ilev)%XX(1,k3) = xin(iedge2,i)
237 crkavx(ilev)%XX(2,k3) = yin(iedge2,i)
238 crkavx(ilev)%XX(3,k3) = zin(iedge2,i)
239 END IF
240
241 ELSEIF (itri > 0) THEN
242
243 IF (ixel == 1) THEN
244
245
246
247
248 crkavx(ilev)%XX(1,k1) = xin(iedge1,i)
249 crkavx(ilev)%XX(2,k1) = yin(iedge1,i)
250 crkavx(ilev)%XX(3,k1) = zin(iedge1,i)
251
252 ELSEIF (ixel == 2) THEN
253
254
255
256 crkavx(ilev)%XX(1,k2) = xin(iedge1,i)
257 crkavx(ilev)%XX(2,k2) = yin(iedge1,i)
258 crkavx(ilev)%XX(3,k2) = zin(iedge1,i)
259 crkavx(ilev)%XX(1,k3) = xin(iedge2,i)
260 crkavx(ilev)%XX(2,k3) = yin(iedge2,i)
261 crkavx(ilev)%XX(3,k3) = zin(iedge2,i)
262 ELSEIF (ixel == 3) THEN
263
264
265
266 crkavx(ilev)%XX(1,k1) = xin(iedge2,i)
267 crkavx(ilev)%XX(2,k1) = yin(iedge2,i)
268 crkavx(ilev)%XX(3,k1) = zin(iedge2,i)
269
273
274
275
276 END IF
277
278 ENDIF
279
280 ENDDO
281
282 RETURN
type(xfem_phantom_), dimension(:), allocatable xfem_phantom
type(xfem_nodes_), dimension(:), allocatable crknod
type(xfem_avx_), dimension(:), allocatable crkavx
type(xfem_shell_), dimension(:), allocatable crkshell