36
38 use element_mod , only : nixc,nixtg
39
40
41
42#include "implicit_f.inc"
43
44
45
46#include "com01_c.inc"
47#include "com04_c.inc"
48#include "com_xfem1.inc"
49
50
51
52 INTEGER IBORDNODE(*),IXC(NIXC,*),IXTG(NIXTG,*),IEDGESH4(4,*),
53 . IEDGESH3(3,*),IBORDEDGE(*),NODEDGE(2,*),IELCRKC(*),IELCRKTG(*),
54 . IEDGE(*),CEP_CRK(*),IEDGE_TMP0(*)
55
56
57
58 INTEGER I,J,K,L,JJ,LL,I1,I2,I1M,I2M,NL,IED,NLMAX,STAT,
59 . NELALL,NEL,NIX,JCRK0,JCRK,P,PROC
60 INTEGER NEXTK4(4),NEXTK3(3),IWORK(70000)
61 INTEGER, DIMENSION(:,:), ALLOCATABLE ::
62 . LINEIX,LINEIX2,IXWORK,IEDWORK4,IEDWORK3
63 INTEGER, DIMENSION(:), ALLOCATABLE ::
64 . INDEX,TAGED,ITAGED,NIXEL,TAGEL,TAGEL_CRK,IEDGE_TMP
65
66 DATA nextk4/2,3,4,1/
67 DATA nextk3/2,3,1/
68
69 nlmax = 4*ecrkxfec + 3*ecrkxfetg
70 nelall = ecrkxfec+ecrkxfetg
71
72 ALLOCATE (lineix(2,nlmax) ,stat=stat)
73 ALLOCATE (lineix2(2,nlmax) ,stat=stat)
74 ALLOCATE (index(2*nlmax) ,stat=stat)
75 ALLOCATE (ixwork(5,nlmax) ,stat=stat)
76 ALLOCATE (iedwork4(4,ecrkxfec) ,stat=stat)
77 ALLOCATE (iedwork3(3,ecrkxfetg),stat=stat)
78 ALLOCATE (taged(nlmax) ,stat=stat)
79 ALLOCATE (itaged(nlmax) ,stat=stat)
80 ALLOCATE (nixel(nelall) ,stat=stat)
81 ALLOCATE (tagel(nelall) ,stat=stat)
82 ALLOCATE (tagel_crk(nelall) ,stat=stat)
83 lineix = 0
84 lineix2 = 0
85 index = 0
86 ixwork = 0
87 iedwork4= 0
88 iedwork3= 0
89 taged = 0
90 itaged = 0
91 nixel = 0
92 tagel = 0
93 tagel_crk = 0
94
95 IF (stat /= 0) THEN
96 CALL ancmsg(msgid=268 ,msgtype=msgerror,anmode=anstop,c1=
'EDGE XFEM')
97 END IF
98
99
100
101 ll = 0
102 nel = 0
103 DO j=1,numelc
104 IF (ielcrkc(j) > 0) THEN
105 nel = nel + 1
106 nixel(nel) = 4
107 tagel(nel) = j
108 tagel_crk(nel) = ielcrkc(j)
109 ENDIF
110 END DO
111
112 DO j=1,numeltg
113 IF (ielcrktg(j) > 0) THEN
114 nel = nel + 1
115 nixel(nel) = 3
116 tagel(nel) = j
117 tagel_crk(nel) = ielcrktg(j)-ecrkxfec
118 ENDIF
119 END DO
120
121 DO i=1,nel
122 j = tagel(i)
123 nix = nixel(i)
124 IF (nix == 4) THEN
125
126
127
128
129 DO k=1,nix
130 i1 = ixc(k+1,j)
131 i2 = ixc(nextk4(k)+1,j)
132 ll = ll+1
133 IF(i2 > i1)THEN
134 lineix(1,ll) = i1
135 lineix(2,ll) = i2
136
137 lineix2(1,ll) = i
138 lineix2(2,ll) = k
139 ELSE
140 lineix(1,ll) = i2
141 lineix(2,ll) = i1
142
143 lineix2(1,ll) = i
144 lineix2(2,ll) = -k
145 ENDIF
146 ENDDO
147 ELSE IF (nix == 3) THEN
148
149
150
151 DO k=1,nix
152 i1 = ixtg(k+1,j)
153 i2 = ixtg(nextk3(k)+1,j)
154 ll = ll+1
155 IF(i2 > i1)THEN
156 lineix(1,ll) = i1
157 lineix(2,ll) = i2
158
159 lineix2(1,ll) = i
160 lineix2(2,ll) = k
161 ELSE
162 lineix(1,ll) = i2
163 lineix(2,ll) = i1
164
165 lineix2(1,ll) = i
166 lineix2(2,ll) = -k
167 ENDIF
168 ENDDO
169 END IF
170 END DO
171
172 CALL my_orders(0,iwork,lineix,index,ll,2)
173
174
175
177 i1m = lineix(1,index(1))
178 i2m = lineix(2,index(1))
181 ixwork(3,
nl)=lineix2(1,index(1))
182 ixwork(4,
nl)=lineix2(2,index(1))
184
186 k = abs(ixwork(4,
nl))
187 nix = nixel(j)
188 i = tagel(j)
189 jj = tagel_crk(j)
190 IF (nix == 4) THEN
192 ELSE IF (nix == 3) THEN
194 END IF
195
196 DO l=2,ll
197 i1 = lineix(1,index(l))
198 i2 = lineix(2,index(l))
199 IF(i2 /= i2m .or. i1 /= i1m)THEN
203 ixwork(3,
nl)=lineix2(1,index(l))
204 ixwork(4,
nl)=lineix2(2,index(l))
206
208 k = abs(ixwork(4,
nl))
209 nix = nixel(j)
210 i = tagel(j)
211 jj = tagel_crk(j)
212 IF(nix == 4)THEN
214 ELSE IF(nix == 3)THEN
216 END IF
217 ELSE
219
220 j = lineix2(1,index(l))
221 k = abs(lineix2(2,index(l)))
222 nix = nixel(j)
223 i = tagel(j)
224 jj = tagel_crk(j)
225 IF(nix == 4)THEN
227 ELSE IF(nix == 3)THEN
229 END IF
230 ENDIF
231 i1m = i1
232 i2m = i2
233 ENDDO
234
236
237
238
240 DO j=1,nel
241 nix = nixel(j)
242 i = tagel(j)
243 jj = tagel_crk(j)
244 IF (nix == 4) THEN
245 DO k=1,nix
246 ied = iedwork4(k,jj)
247 IF (taged(ied) == 0) THEN
250 taged( ied) = 1
252 ibordedge(
nl) = ixwork(5,ied)
253 IF(ixwork(5,ied) == 1)THEN
254 ibordnode(ixwork(1,ied)) = 1
255 ibordnode(ixwork(2,ied)) = 1
256 END IF
257
258 nodedge(1,
nl) = ixwork(1,ied)
259 nodedge(2,
nl) = ixwork(2,ied)
260 END IF
261 iedgesh4(k,jj) = itaged(ied)
262 END DO
263 ELSE IF (nix == 3) THEN
264 DO k=1,nix
265 ied = iedwork3(k,jj)
266 IF (taged(ied) == 0) THEN
269 taged(ied) = 1
270 ibordedge(
nl) = ixwork(5,ied)
272 IF(ixwork(5,ied) == 1)THEN
273 ibordnode(ixwork(1,ied)) = 1
274 ibordnode(ixwork(2,ied)) = 1
275 END IF
276
277 nodedge(1,
nl) = ixwork(1,ied)
278 nodedge(2,
nl) = ixwork(2,ied)
279 END IF
280 iedgesh3(k,jj) = itaged(ied)
281 END DO
282 END IF
283 END DO
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328 ALLOCATE (iedge_tmp(numedges))
329 iedge_tmp = 0
330
331 DO p = 1,nspmd
332 itaged = 0
333 DO i=1,nel
334
335 nix = nixel(i)
336 jcrk0 = tagel_crk(i)
337 jcrk = jcrk0
338 IF(nix == 3) jcrk = jcrk + ecrkxfec
339 proc = cep_crk(jcrk) + 1
340 IF(p == proc)THEN
341 IF(nix==4)THEN
342 DO k=1,nix
343 ied = iedgesh4(k,jcrk0)
344
345
346
347
348
349
350 IF(ied /= 0 .AND. ibordedge(ied) == 0)THEN
351 IF(iedge_tmp(ied) >= 0)THEN
352 iedge_tmp(ied) = iedge_tmp(ied) + 1
353 ENDIF
354 ENDIF
355 ENDDO
356 ELSEIF(nix==3)THEN
357 DO k=1,nix
358 ied = iedgesh3(k,jcrk0)
359
360
361
362
363
364
365 IF(ied /= 0 .AND. ibordedge(ied) == 0)THEN
366 IF(iedge_tmp(ied) >= 0)THEN
367 iedge_tmp(ied) = iedge_tmp(ied) + 1
368 ENDIF
369 ENDIF
370 ENDDO
371 ENDIF
372 END IF
373 END DO
374
375 DO ied=1,numedges
376 IF(iedge_tmp(ied) == 1) iedge_tmp(ied) = -1
377 ENDDO
378
379 END DO
380
381 DO ied=1,numedges
382 IF(iedge_tmp(ied) == -1) iedge_tmp0(ied) = iedge_tmp(ied)
383 ENDDO
384
385
386 DEALLOCATE (index)
387 DEALLOCATE (ixwork)
388 DEALLOCATE (lineix)
389 DEALLOCATE (lineix2)
390 DEALLOCATE (iedwork4)
391 DEALLOCATE (iedwork3)
392 DEALLOCATE (taged)
393 DEALLOCATE (itaged)
394 DEALLOCATE (nixel)
395 DEALLOCATE (tagel)
396 DEALLOCATE (tagel_crk)
397 DEALLOCATE (iedge_tmp)
398
399 RETURN
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)
character *2 function nl()