47
48
49
50
54 USE format_mod , ONLY : fmw_10i, fmw_4i
55 use element_mod , only :nixs,nixc,nixtg
56
57
58
59#include "implicit_f.inc"
60
61
62
63#include "com04_c.inc"
64#include "units_c.inc"
65#include "param_c.inc"
66#include "scr03_c.inc"
67
68
69
70 INTEGER IALLO,NBINFLG(*)
71 INTEGER IPARI(NPARI),
72 . IRECT(4,*), NSV(*),MSEGTYP(*),
73 . MSR(*),ITAB(*),MBINFLG(*),
74 . ISEADD(*) ,ISEDGE(*),ITAG(*),INTPLY,
75 . IXC(NIXC,*),IXTG(NIXTG,*),KNOD2ELC(*),KNOD2ELTG(*),
76 . NOD2ELC(*),NOD2ELTG(*),KNOD2ELS(*),NOD2ELS(*),
77 . IRTSE(5,*) ,IS2SE(*),IS2PT(*) ,IS2ID(*)
78 INTEGER IXS(NIXS,*),IXS10(6,*), IXS16(8,*), IXS20(12,*)
79 INTEGER MODE, WORK(70000), NRTMP, I1, I2
80 INTEGER, DIMENSION(:),ALLOCATABLE :: INDEX
81 INTEGER, DIMENSION(:,:),ALLOCATABLE :: IRECTMP
82 INTEGER, DIMENSION(:,:),ALLOCATABLE :: IRECTMP_SAV
83 INTEGER, INTENT(IN) :: NIN25
84 INTEGER, INTENT(INOUT) :: FLAG_ELEM_INTER25(NINTER25,NUMELS)
86 . x(3,*),frigap(*)
87
88 TYPE (GROUP_) , DIMENSION(NGRNOD) :: IGRNOD
89 TYPE (SURF_) , DIMENSION(NSURF) :: IGRSURF
90 TYPE (PARAMETERS_) ,INTENT(INOUT) :: PARAMETERS
91
92
93
94 INTEGER I,J,K,L,ISU1,ISU2,NOD1,NRTM,,NSN,NMN,
95 . ILEV,NLN
96 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG,TAGS
97 INTEGER STAT,IJ,
98 INTEGER NSU1,NLS1,NLS2,NRTM_SH,NRTM0,
99 . ,IDEB,ISN
100 LOGICAL :: NEED_SOLID_EROSION
101 INTEGER :: IDEL,SOLID_SEGMENT,ELEM
102
103
104
105 INTEGER BITSET
107
108 CHARACTER MESS*40
109 DATA mess/'INTERFACE INPUT '/
110
111 nsn = 0
112 nmn = 0
113 nrtm = 0
114 nrts = 0
115 nod1 = ipari(26)
116 nln = 0
117 ilev = ipari(20)
118 isu1 = ipari(45)
119 isu2 = ipari(46)
120 nsu1 = 0
121 nls1 = 0
122 nls2 = 0
123 IF(iallo == 2 .AND. ilev == 2 ) THEN
124 imbin=1
125 ELSE
126 imbin=0
127 END IF
128
129
130
131
132
133
134
135
136
137 SELECT CASE (ilev)
138
139 CASE(1)
140 nrtm = igrsurf(isu1)%NSEG
141 CASE(2)
142 nrtm = igrsurf(isu1)%NSEG
143 nrts = igrsurf(isu2)%NSEG
144 nrtm = nrtm + nrts
145 CASE(3)
146 nrtm = igrsurf(isu2)%NSEG
147 END SELECT
148
149 ALLOCATE(index(2*nrtm),irectmp(6,nrtm),stat=stat)
150 IF (stat /= 0)
CALL ancmsg(msgid=268,anmode=aninfo,
151 . msgtype=msgerror,
152 . c1='IRECTSAV')
153 irectmp(1:6,1:nrtm)=0
154
155
156
157
158 l = 0
159 IF(isu1 /= 0)THEN
160 DO j=1,igrsurf(isu1)%NSEG
161 l = l+1
162 DO k=1,4
163 irectmp(k,l) = igrsurf(isu1)%NODES(j,k)
164 ENDDO
165 irectmp(5,l) = igrsurf(isu1)%ELTYP(j)
166 CALL in24coq_sol3(irectmp(1,l) ,ixc ,ixtg ,irectmp(5,l) ,x ,
167 . knod2elc ,knod2eltg ,nod2elc ,nod2eltg,
168 . knod2els,nod2els,ixs ,ixs10 ,ixs16 ,ixs20 )
169 IF(imbin /= 0)irectmp(6,l) =
bitset(irectmp(6,l),0)
170 IF(ilev==1.OR.ilev==2) THEN
171 elem = igrsurf(isu1)%ELEM(j)
172 IF(elem/=0.AND.igrsurf(isu1)%ELTYP(j)==1) flag_elem_inter25(nin25,elem) = 1
173 ENDIF
174 ENDDO
175 ENDIF
176 nsu1 = l
177 IF(isu2 /= 0 .AND.ilev /=1)THEN
178 DO j=1,igrsurf(isu2)%NSEG
179 l = l+1
180 DO k=1,4
181 irectmp(k,l) = igrsurf(isu2)%NODES(j,k)
182
183
184 ENDDO
185 irectmp(5,l) = igrsurf(isu2)%ELTYP(j)
186 CALL in24coq_sol3(irectmp(1,l) ,ixc ,ixtg ,irectmp(5,l) ,x ,
187 . knod2elc ,knod2eltg ,nod2elc ,nod2eltg,
188 . knod2els,nod2els,ixs ,ixs10 ,ixs16 ,ixs20 )
189 IF(imbin /= 0) irectmp(6,l) =
bitset(irectmp(6,l),1)
190 elem = igrsurf(isu2)%ELEM(j)
191 IF(elem/=0.AND.igrsurf(isu2)%ELTYP(j)==1) flag_elem_inter25(nin25,elem) = 1
192 ENDDO
193 ENDIF
194
195
196 nrtmp=nrtm
197
198 ALLOCATE(irectmp_sav(6,nrtm),stat=stat)
199
200
201 irectmp_sav(1:6,1:nrtm) = irectmp(1:6,1:nrtm)
202 DO i=1,nrtm
203 IF(irectmp(5,i)==0.OR.irectmp(5,i)==1) THEN
204 IF(irectmp(4,i)==irectmp(3,i)) irectmp(4,i) = 0
205 DO j=1,3
206 imin = irectmp(j,i)
207 ij = j
208 DO k=j+1,4
209 IF(irectmp(k,i)<imin.AND.irectmp(k,i) /= 0) THEN
210 imin = irectmp(k,i)
211 ij = k
212 ENDIF
213 ENDDO
214 IF(ij /=j ) THEN
215 irectmp(ij,i) = irectmp(j,i)
216 irectmp(j,i) = imin
217 ENDIF
218 ENDDO
219 ENDIF
220 ENDDO
221
222 mode=0
223 CALL my_orders( mode, work, irectmp, index, nrtm , 6)
224
225 IF(iallo==1)THEN
226
227 nrtm_sh=0
228
229 ideb=1
230 i1=index(ideb)
231 DO WHILE(irectmp(1,i1)==0)
232 ideb=ideb+1
233 i1=index(ideb)
234 END DO
235
236 nrtm =1
237 IF(irectmp(5,i1)/=0 .AND. irectmp(5,i1)/=1) nrtm_sh=nrtm_sh+1
238
239 DO j=ideb,nrtmp-1
240 i1=index(j)
241 i2=index(j+1)
242
243 IF(irectmp(1,i2)/=irectmp(1,i1).OR.
244 . irectmp(2,i2)/=irectmp(2,i1).OR.
245 . irectmp(3,i2)/=irectmp(3,i1).OR.
246 . irectmp(4,i2)/=irectmp(4,i1).OR.
247 . irectmp(5,i2)/=irectmp(5,i1))THEN
248
249 nrtm=nrtm+1
250 IF(irectmp(5,i2)/=0 .AND. irectmp(5,i2)/=1) nrtm_sh=nrtm_sh+1
251
252 END IF
253 END DO
254 ELSE
255
256 ideb=1
257 i1=index(ideb)
258 DO WHILE(irectmp(1,i1)==0)
259 ideb=ideb+1
260 i1=index(ideb)
261 END DO
262
263 nrtm=1
264 irect(1,nrtm)=irectmp_sav(1,i1)
265 irect(2,nrtm)=irectmp_sav(2,i1)
266 irect(3,nrtm)=irectmp_sav(3,i1)
267 irect(4,nrtm)=irectmp_sav(4,i1)
268 msegtyp(nrtm)=irectmp_sav(5,i1)
269 IF(imbin/=0) mbinflg(nrtm)=irectmp_sav(6,i1)
270
271 DO j=ideb,nrtmp-1
272 i1=index(j)
273 i2=index(j+1)
274 IF(irectmp(1,i2)/=irectmp(1,i1).OR.
275 . irectmp(2,i2)/=irectmp(2,i1).OR.
276 . irectmp(3,i2)/=irectmp(3,i1).OR.
277 . irectmp(4,i2)/=irectmp(4,i1).OR.
278 . irectmp(5,i2)/=irectmp(5,i1))THEN
279
280 nrtm=nrtm+1
281 irect(1,nrtm)=irectmp_sav(1,i2)
282 irect(2,nrtm)=irectmp_sav(2,i2)
283 irect(3,nrtm)=irectmp_sav(3,i2)
284 irect(4,nrtm)=irectmp_sav(4,i2)
285 msegtyp(nrtm)=irectmp_sav(5,i2)
286 IF(imbin/=0) mbinflg(nrtm)=irectmp_sav(6,i2)
287
288 ELSEIF(irectmp(6,i1)/=irectmp(6,i2))THEN
289 IF(imbin/=0) mbinflg(nrtm)=1+2
290 END IF
291 END DO
292 END IF
293
294
295 DEALLOCATE(index,irectmp)
296 IF(ALLOCATED(irectmp_sav)) DEALLOCATE(irectmp_sav)
297
298
299
300
301
302 ALLOCATE(tag(numnod),tags(numnod))
303 DO i=1,numnod
304 tag(i)=0
305 tags(i)=0
306 ENDDO
307 IF(isu2 /= 0)THEN
308 DO j=1,igrsurf(isu2)%NSEG
309 DO k=1,4
310 tag(igrsurf(isu2)%NODES(j,k)) = 2
311 ENDDO
312 ENDDO
313 ENDIF
314 IF(isu1 /= 0)THEN
315 DO j=1,igrsurf(isu1)%NSEG
316 DO k=1,4
317 i=igrsurf(isu1)%NODES(j,k)
318 IF(tag(i) == 0)THEN
319 tag(i) = 1
320 ELSEIF(tag(i) == 2)THEN
321 tag(i) = 3
322 ENDIF
323 ENDDO
324 ENDDO
325 ENDIF
326
327 IF(iallo == 1) THEN
328 IF(isu2 /= 0)THEN
329 DO j=1,igrsurf(isu2)%NSEG
330 DO k=1,4
331
332
333
334
335 ENDDO
336 ENDDO
337 ENDIF
338 IF(isu1 /= 0)THEN
339 DO j=1,igrsurf(isu1)%NSEG
340 DO k=1,4
341 i=igrsurf(isu1)%NODES(j,k)
342
343
344
345 ENDDO
346 ENDDO
347 ENDIF
348 ENDIF
349
350
351
352 IF(isu2 /= 0)THEN
353 DO j=1,igrsurf(isu2)%NSEG
354 DO k=1,4
355 i=igrsurf(isu2)%NODES(j,k)
356 IF(tag(i) == 2 )THEN
357 nmn = nmn + 1
358 IF(iallo == 2)msr(nmn) = i
359 ENDIF
360
361 IF(tag(i) == 2 .OR. tag(i) == 3)THEN
362 tag(i) = - tag(i)
363 IF ( ilev == 2.AND.tags(i) == 0 ) THEN
364 nsn = nsn + 1
365 tags(i) = nsn
366 IF(iallo == 2) THEN
367 nsv(nsn) = i
368 IF(ilev == 2)nbinflg(nsn) =
bitset(nbinflg(nsn),1)
369 END IF
370 END IF
371 ENDIF
372 ENDDO
373 ENDDO
374 ENDIF
375
376
377
378 IF(isu1 /= 0)THEN
379 DO j=1,igrsurf(isu1)%NSEG
380 DO k=1,4
381 i=igrsurf(isu1)%NODES(j,k)
382 IF(tags(i) == 0 .AND. ilev /= 3 ) THEN
383 nsn = nsn + 1
384 tags(i) = nsn
385 IF(iallo == 2) THEN
386 nsv(nsn) = i
387 IF(ilev == 2)nbinflg(nsn) =
bitset(nbinflg(nsn),0)
388 END IF
389 ELSEIF(ilev==2)THEN
390 IF(iallo == 2) THEN
391 isn=tags(i)
392 nbinflg(isn) =
bitset(nbinflg(isn),0)
393 END IF
394 ENDIF
395
396 IF(tag(i) == 1 .or. tag(i) == -3)THEN
397 tag(i) = - tag(i)
398 nmn = nmn + 1
399 IF(iallo == 2)msr(nmn) = i
400 ENDIF
401 ENDDO
402 ENDDO
403 ENDIF
404
405
406
407 IF(nod1 /= 0)THEN
408 DO j=1,igrnod(nod1)%NENTITY
409 i = igrnod(nod1)%ENTITY(j)
410 IF(tags(i) == 0)THEN
411 nsn = nsn+1
412 tags(i) = nsn
413 IF(iallo == 2) THEN
414 nsv(nsn) = i
415 IF(ilev == 2)nbinflg(nsn) =
bitset(nbinflg(nsn),2)
416 END IF
417 ENDIF
418 ENDDO
419 ENDIF
420
421 IF(iallo == 2 .and. ipri >= 5) THEN
422 WRITE(iout,'(/,A,I10,/)')' NODES USED FOR SECONDARY SIDE, INTERFACE ID=',ipari(15)
423 WRITE(iout,fmt=fmw_10i)(itab(nsv(i)),i=1,nsn)
424 ENDIF
425
426
427
428
429
430 IF(iallo == 2) THEN
431 nln = ipari(35)
432 ipari(51) = nls1
433 ipari(52) = nls2
434
435 nrtm_sh= ipari(42)
436 nrtm0 = ipari(4) - nrtm_sh
437 CALL sh2surf25(nrtm0,irect,imbin,mbinflg,msegtyp,ipari(4))
438
439 IF(ipri>=5) THEN
440 WRITE(iout,'(/,A,I10,/)')' SEGMENTS USED FOR MAIN SURFACE, INTERFACE ID=',ipari(15)
441 DO i=1,nrtm
442 WRITE(iout,fmt=fmw_4i)(itab(irect(k,i)),k=1,4)
443 ENDDO
444 ENDIF
445
446 ELSE
447
448 ipari(3) = 0
449 ipari(4) = nrtm
450 ipari(5) = nsn
451 ipari(6) = nmn
452 ipari(35) = nln
453 ipari(42) = nrtm_sh
454
455 idel = ipari(17)
456 solid_segment = nrtm - nrtm_sh
457 need_solid_erosion = .false.
458
459
460
461
462 IF(idel/=0.AND.solid_segment>0) THEN
463 IF(isu1/=0) THEN
464 IF(igrsurf(isu1)%EXT_ALL==2) need_solid_erosion = .true.
465 ENDIF
466 IF(isu2/=0) THEN
467 IF(igrsurf(isu2)%EXT_ALL==2) need_solid_erosion = .true.
468 ENDIF
469 ENDIF
470 IF(idel > 0.AND.solid_segment>0) THEN
471 ipari(100) = 1
472 parameters%INT25_EROSION_SOLID = 1
473 ENDIF
474
475 END IF
476
477 DEALLOCATE(tag,tags)
478
479 RETURN
integer function bitset(i, n)
subroutine in24coq_sol3(irect, ixc, ixtg, msegtyp, x, knod2elc, knod2eltg, nod2elc, nod2eltg, knod2els, nod2els, ixs, ixs10, ixs16, ixs20)
subroutine sh2surf25(nrtm0, irect, imbin, mbinflg, msegtyp, nrtm)
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)