38
39
40
42 USE elbufdef_mod
43
44
45
46#include "implicit_f.inc"
47
48
49
50#include "mvsiz_p.inc"
51
52
53
54#include "com_xfem1.inc"
55
56
57
58 INTEGER LFT,LLT,NFT,NXLAY
59 INTEGER IELCRKC(*),EDGEC(4,*),IEDGESH4(4,*),ELCUT(*),XNOD(2,2),
60 . (NIXC,*),NODEDGE(2,*),TAGSKYC(4,*),KNOD2ELC(*),TAGEDGE(*)
62 . x1l(*),y1l(*),x2l(*),y2l(*),x3l(*),y3l(*),x4l(*),y4l(*),
63 . beta0(2)
64
65 TYPE (ELBUF_STRUCT_), TARGET :: ELBUF_STR
66 TYPE (ELBUF_STRUCT_), DIMENSION(NXEL) , TARGET :: XFEM_STR
67 TYPE (XFEM_LVSET_) , DIMENSION(NLEVMAX) :: CRKLVSET
68 TYPE (XFEM_SHELL_) , DIMENSION(NLEVMAX) :: CRKSHELL
69 TYPE (XFEM_EDGE_) , DIMENSION(NXLAYMAX) :: CRKEDGE
70 TYPE (XFEM_PHANTOM_), DIMENSION(NXLAYMAX) :: XFEM_PHANTOM
71
72
73
74 INTEGER I,K,II,R,,IED,p1,p2,dd(4),d1(4),d2(4),IFI(2),
75 . ICUT,IEDGE,IC1,IC2,ICRK,ILEV(NXEL),IL,ILAY,N(4),ISIGN0(4),
76 . NOD1,NOD2,IXEL,IENR0(4),IENR(4),NTAG(4)
78 . fit(4,mvsiz),xn(4),yn(4),xmi(2),ymi(2),beta(2,mvsiz),
79 . off_phantom
80 EXTERNAL lsintx
82 TYPE(G_BUFEL_) , POINTER :: GBUF
83 TYPE(L_BUFEL_) , POINTER :: LBUF
84
85 DATA dd/2,3,4,1/
86 DATA d1/2,3,4,5/
87 DATA d2/3,4,5,2/
88
89 p2 = 0
90 DO i=lft,llt
91 xn(1)=x1l(i)
92 yn(1)=y1l(i)
93 xn(2)=x2l(i)
94 yn(2)=y2l(i)
95 xn(3)=x3l(i)
96 yn(3)=y3l(i)
97 xn(4)=x4l(i)
98 yn(4)=y4l(i)
99 IF (elcut(i+nft) > 0) THEN
100 DO r=1,4
101 p1 = r
102 p2 = dd(r)
103 ied = edgec(r,i+nft)
104 IF (ied > 0) THEN
105 xmi(ied) = half*(xn(p1)+xn(p2))
106 ymi(ied) = half*(yn(p1)+yn(p2))
107 ENDIF
108 ENDDO
109
110 DO r=1,4
111 fit(r,i) = lsintx(xmi(1),ymi(1),xmi(2),ymi(2),xn(r),yn(r))
112 ENDDO
113 ENDIF
114 ENDDO
115
116 DO i=lft,llt
117 elcrk = ielcrkc(i+nft)
118 beta(1,i) = zero
119 beta(2,i) = zero
120 IF (elcut(i+nft) > 0) THEN
121
122 DO r=1,4
123 iedge = iedgesh4(r,elcrk)
124 ied = edgec(r,i+nft)
125 IF (ied > 0) THEN
126 nod1 = nodedge(1,iedge)
127 nod2 = nodedge(2,iedge)
128 IF (nod1 == xnod(ied,1) .and. nod2 == xnod(ied,2)) THEN
129 beta(ied,i) = beta0(ied)
130 ELSE IF (nod2 == xnod(ied,1) .and. nod1 == xnod(ied,2)) THEN
131 beta(ied,i) = one - beta0(ied)
132 END IF
133 ENDIF
134 ENDDO
135 ENDIF
136 ENDDO
137
138
139 DO ilay=1,nxlay
140 ii = nxel*(ilay-1)
141 DO k=1,nxel
142 ilev(k) = ii + k
143 ENDDO
144 DO i=lft,llt
145 elcrk = ielcrkc(i+nft)
146 IF (elcut(i+nft) > 0) THEN
147 icrk = crkshell(ilev(1))%PHANTOMG(elcrk)
148 crklvset(ilev(1))%ELCUT(elcrk) = icrk
149 crklvset(ilev(2))%ELCUT(elcrk) = -icrk
150
151 xfem_phantom(ilay)%ELCUT(elcrk) = icrk
152 crkedge(ilay)%LAYCUT(elcrk) = 2
153
154 n(1) = ixc(2,i+nft)
155 n(2) = ixc(3,i+nft)
156 n(3) = ixc(4,i+nft)
157 n(4) = ixc(5,i+nft)
158
159 isign0(1) = int(sign(one,fit(1,i))) * icrk
160 isign0(2) = int(sign(one,fit(2,i))) * icrk
161 isign0(3) = int(sign(one,fit(3,i))) * icrk
162 isign0(4) = int(sign(one,fit(4,i))) * icrk
163
164 ntag(1:4) = 0
165
166 DO r=1,4
167 ienr0(r) = 0
168 ienr(r)=0
169 ied = edgec(r,i+nft)
170 IF(ied > 0)THEN
171 ntag(r) = ntag(r) + 1
172 ntag(dd(r)) = ntag(dd(r)) + 1
173 ENDIF
174 ENDDO
175
176 DO r=1,4
177 ied = edgec(r,i+nft)
178 iedge = iedgesh4(r,elcrk)
179 IF(ied > 0)THEN
180 nod1 = nodedge(1,iedge)
181 nod2 = nodedge(2,iedge)
182 IF(nod1 == n(r) .and. nod2 == n(dd(r)))THEN
183 p1 = r
184 p2 = dd(r)
185 ELSE IF(nod2 == n(r) .and. nod1 == n(dd(r)))THEN
186 p1 = dd(r)
187 p2 = r
188 END IF
189 IF(ntag(p1) > 0.AND.crkedge(ilay)%EDGEENR(1,iedge) > 0)
190 . ienr0(p1) = crkedge(ilay)%EDGEENR(1,iedge)
191 IF(ntag(p2) > 0.AND.crkedge(ilay)%EDGEENR(2,iedge) > 0)
192 . ienr0(p2) = crkedge(ilay)%EDGEENR(2,iedge)
193 ENDIF
194 ENDDO
195
196 DO r=1,4
197 IF(ienr0(r) /= 0)THEN
198 ienr(r) = ienr0(r)
199 ELSE
200 ienr(r) = tagskyc(r,i+nft)+knod2elc(n(r))*(ilay-1)
201 ENDIF
202 ENDDO
203
204 DO r=1,4
205 ied = edgec(r,i+nft)
206 iedge = iedgesh4(r,elcrk)
207 IF (ied > 0) THEN
208 DO il=1,nxel
209 crklvset(ilev(il))%EDGE(r,elcrk) = ied
210 crklvset(ilev(il))%ICUTEDGE(iedge) = 1
211 crklvset(ilev(il))%RATIOEDGE(iedge) = beta(ied,i)
212 ENDDO
213
214 crkedge(ilay)%EDGETIP(1,iedge) =
max(ied,
215 . crkedge(ilay)%EDGETIP(1,iedge))
216 crkedge(ilay)%EDGETIP(2,iedge) =
217 . crkedge(ilay)%EDGETIP(2,iedge) + 1
218
219
220
221 IF(crkedge(ilay)%EDGEICRK(iedge) == 0)
222 . crkedge(ilay)%EDGEICRK(iedge) = icrk
223
224 nod1 = nodedge(1,iedge)
225 nod2 = nodedge(2,iedge)
226 ifi(1:2) = 0
227 p1 = 0
228 p2 = 0
229 IF(nod1 == n(r) .and. nod2 == n(dd(r)))THEN
230 ifi(1) = isign0(r)
231 ifi(2) = isign0(dd(r))
232 p1 = r
233 p2 = dd(r)
234 ELSE IF(nod2 == n(r) .and. nod1 == n(dd(r)))THEN
235 ifi(1) = isign0(dd(r))
236 ifi(2) = isign0(r)
237 p1 = dd(r)
238 p2 = r
239 END IF
240 IF(crkedge(ilay)%EDGEIFI(1,iedge) == 0)
241 . crkedge(ilay)%EDGEIFI(1,iedge) = ifi(1)
242 IF(crkedge(ilay)%EDGEIFI(2,iedge) == 0)
243 . crkedge(ilay)%EDGEIFI(2,iedge) = ifi(2)
244 IF(crkedge(ilay)%EDGEENR(1,iedge) == 0)
245 . crkedge(ilay)%EDGEENR(1,iedge) = ienr(p1)
246 IF(crkedge(ilay)%EDGEENR(2,iedge) == 0)
247 . crkedge(ilay)%EDGEENR(2,iedge) = ienr(p2)
248 ENDIF
249 ENDDO
250 ENDIF
251 ENDDO
252 ENDDO
253
254
255
256 IF (nxlay > 1) THEN
257 DO ixel=1,nxel
258 DO ilay=1,nxlay
259 lbuf => xfem_str(ixel)%BUFLY(ilay)%LBUF(1,1,1)
260 DO i=lft,llt
261 IF(elcut(i+nft) > 0)THEN
262 off_phantom = lbuf%OFF(i)
263 lbuf%OFF(i) = - off_phantom
264 ENDIF
265 ENDDO
266 ENDDO
267 ENDDO
268 ELSE
269 DO ixel=1,nxel
270 gbuf => xfem_str(ixel)%GBUF
271 DO i=lft,llt
272 IF(elcut(i+nft) > 0)THEN
273 off_phantom = gbuf%OFF(i)
274 gbuf%OFF(i) = - off_phantom
275 ENDIF
276 ENDDO
277 ENDDO
278 ENDIF
279
280
281
282 DO i=lft,llt
283 IF(elcut(i+nft) > 0)THEN
284 elbuf_str%GBUF%OFF(i) = zero
285 ENDIF
286 ENDDO
287
288 DO i=lft,llt
289 elcrk = ielcrkc(i+nft)
290 IF(elcut(i+nft) > 0)THEN
291 DO r=1,4
292 ied = edgec(r,i+nft)
293 iedge = iedgesh4(r,elcrk)
294 IF(ied > 0)THEN
295 tagedge(iedge) = tagedge(iedge) + 1
296 ENDIF
297 ENDDO
298 ENDIF
299 ENDDO
300
301 RETURN