47
48
49
50
54 USE format_mod , ONLY : fmw_10i, fmw_4i
55
56
57
58#include "implicit_f.inc"
59
60
61
62#include "com04_c.inc"
63#include "units_c.inc"
64#include "param_c.inc"
65#include "scr03_c.inc"
66
67
68
69 INTEGER IALLO,NBINFLG(*)
70 INTEGER IPARI(NPARI),
71 . IRECT(4,*), NSV(*),MSEGTYP(*),
72 . MSR(*),ITAB(*),MBINFLG(*),
73 . ISEADD(*) ,ISEDGE(*),ITAG(*),INTPLY,
74 . IXC(NIXC,*),IXTG(NIXTG,*),KNOD2ELC(*),KNOD2ELTG(*),
75 . NOD2ELC(*),NOD2ELTG(*),KNOD2ELS(*),NOD2ELS(*),
76 . IRTSE(5,*) ,IS2SE(*),IS2PT(*) ,IS2ID(*)
77 INTEGER IXS(NIXS,*),IXS10(6,*), IXS16(8,*), IXS20(12,*)
78 INTEGER MODE, WORK(70000), NRTMP, I1, I2
79 INTEGER, DIMENSION(:),ALLOCATABLE :: INDEX
80 INTEGER, DIMENSION(:,:),ALLOCATABLE :: IRECTMP
81 INTEGER, DIMENSION(:,:),ALLOCATABLE :: IRECTMP_SAV
82 INTEGER, INTENT(IN) :: NIN25
83 INTEGER, INTENT(INOUT) :: FLAG_ELEM_INTER25(NINTER25,NUMELS)
85 . x(3,*),frigap(*)
86
87 TYPE (GROUP_) , DIMENSION(NGRNOD) :: IGRNOD
88 TYPE (SURF_) , DIMENSION(NSURF) :: IGRSURF
89 TYPE () ,INTENT(INOUT) :: PARAMETERS
90
91
92
93 INTEGER I,J,K,L,LL,NL,ISU1,ISU2,NOD1,,NRTS,NSN,NMN,
94 . NLINSA,NLINMA,ILEV,NLN,ISYM
95 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG,TAGS
96 INTEGER NLINS,NLINM,LINE1,,STAT,IL,IG,N,II,IJ,IMIN
97 INTEGER NSU1,NLS1,NLS2,NRTM_SH,ETYP,NRTM0,
98 . IMBIN,IM,IDEB,ISN
99 LOGICAL :: NEED_SOLID_EROSION
100 INTEGER :: IDEL,SOLID_SEGMENT,ELEM
101
102
103
104 INTEGER BITSET
106
107 CHARACTER MESS*40
108 DATA mess/'INTERFACE INPUT '/
109
110 nsn = 0
111 nmn = 0
112 nrtm = 0
113 nrts = 0
114 nod1 = ipari(26)
115 nln = 0
116 ilev = ipari(20)
117 isu1 = ipari(45)
118 isu2 = ipari(46)
119 nsu1 = 0
120 nls1 = 0
121 nls2 = 0
122 IF(iallo == 2 .AND. ilev == 2 ) THEN
123 imbin=1
124 ELSE
125 imbin=0
126 END IF
127
128
129
130
131
132
133
134
135
136 SELECT CASE (ilev)
137
138 CASE(1)
139 nrtm = igrsurf(isu1)%NSEG
140 CASE(2)
141 nrtm = igrsurf(isu1)%NSEG
142 nrts = igrsurf(isu2)%NSEG
143 nrtm = nrtm + nrts
144 CASE(3)
145 nrtm = igrsurf(isu2)%NSEG
146 END SELECT
147
148 ALLOCATE(index(2*nrtm),irectmp(6,nrtm),stat=stat)
149 IF (stat /= 0)
CALL ancmsg(msgid=268,anmode=aninfo,
150 . msgtype=msgerror,
151 . c1='IRECTSAV')
152 irectmp(1:6,1:nrtm)=0
153
154
155
156
157 l = 0
158 IF(isu1 /= 0)THEN
159 DO j=1,igrsurf(isu1)%NSEG
160 l = l+1
161 DO k=1,4
162 irectmp(k,l) = igrsurf(isu1)%NODES(j,k)
163 ENDDO
164 irectmp(5,l) = igrsurf(isu1)%ELTYP(j)
165 CALL in24coq_sol3(irectmp(1,l) ,ixc ,ixtg ,irectmp(5,l) ,x ,
166 . knod2elc ,knod2eltg ,nod2elc ,nod2eltg,
167 . knod2els,nod2els,ixs ,ixs10 ,ixs16 ,ixs20 )
168 IF(imbin /= 0)irectmp(6,l) =
bitset(irectmp(6,l),0)
169 IF(ilev==1.OR.ilev==2) THEN
170 elem = igrsurf(isu1)%ELEM(j)
171 IF(elem/=0.AND.igrsurf(isu1)%ELTYP(j)==1) flag_elem_inter25(nin25,elem) = 1
172 ENDIF
173 ENDDO
174 ENDIF
175 nsu1 = l
176 IF(isu2 /= 0 .AND.ilev /=1)THEN
177 DO j=1,igrsurf(isu2)%NSEG
178 l = l+1
179 DO k=1,4
180 irectmp(k,l) = igrsurf(isu2)%NODES(j,k)
181
182
183 ENDDO
184 irectmp(5,l) = igrsurf(isu2)%ELTYP(j)
185 CALL in24coq_sol3(irectmp(1,l) ,ixc ,ixtg ,irectmp(5,l) ,x ,
186 . knod2elc ,knod2eltg ,nod2elc ,nod2eltg,
187 . knod2els,nod2els,ixs ,ixs10 ,ixs16 ,ixs20 )
188 IF(imbin /= 0) irectmp(6,l) =
bitset(irectmp(6,l),1)
189 elem = igrsurf(isu2)%ELEM(j)
190 IF(elem/=0.AND.igrsurf(isu2)%ELTYP(j)==1) flag_elem_inter25(nin25,elem) = 1
191 ENDDO
192 ENDIF
193
194
195 nrtmp=nrtm
196
197 ALLOCATE(irectmp_sav(6,nrtm),stat=stat)
198
199
200 irectmp_sav(1:6,1:nrtm) = irectmp(1:6,1:nrtm)
201 DO i=1,nrtm
202 IF(irectmp(5,i)==0.OR.irectmp(5,i)==1) THEN
203 IF(irectmp(4,i)==irectmp(3,i)) irectmp(4,i) = 0
204 DO j=1,3
205 imin = irectmp(j,i)
206 ij = j
207 DO k=j+1,4
208 IF(irectmp(k,i)<imin.AND.irectmp(k,i) /= 0) THEN
209 imin = irectmp(k,i)
210 ij = k
211 ENDIF
212 ENDDO
213 IF(ij /=j ) THEN
214 irectmp(ij,i) = irectmp(j,i)
215 irectmp(j,i) = imin
216 ENDIF
217 ENDDO
218 ENDIF
219 ENDDO
220
221 mode=0
222 CALL my_orders( mode, work, irectmp, index, nrtm , 6)
223
224 IF(iallo==1)THEN
225
226 nrtm_sh=0
227
228 ideb=1
229 i1=index(ideb)
230 DO WHILE(irectmp(1,i1)==0)
231 ideb=ideb+1
232 i1=index(ideb)
233 END DO
234
235 nrtm =1
236 IF(irectmp(5,i1)/=0 .AND. irectmp(5,i1)/=1) nrtm_sh=nrtm_sh+1
237
238 DO j=ideb,nrtmp-1
239 i1=index(j)
240 i2=index(j+1)
241
242 IF(irectmp(1,i2)/=irectmp(1,i1).OR.
243 . irectmp(2,i2)/=irectmp(2,i1).OR.
244 . irectmp(3,i2)/=irectmp(3,i1).OR.
245 . irectmp(4,i2)/=irectmp(4,i1).OR.
246 . irectmp(5,i2)/=irectmp(5,i1))THEN
247
248 nrtm=nrtm+1
249 IF(irectmp(5,i2)/=0 .AND. irectmp(5,i2)/=1) nrtm_sh=nrtm_sh+1
250
251 END IF
252 END DO
253 ELSE
254
255 ideb=1
256 i1=index(ideb)
257 DO WHILE(irectmp(1,i1)==0)
258 ideb=ideb+1
259 i1=index(ideb)
260 END DO
261
262 nrtm=1
263 irect(1,nrtm)=irectmp_sav(1,i1)
264 irect(2,nrtm)=irectmp_sav(2,i1)
265 irect(3,nrtm)=irectmp_sav(3,i1)
266 irect(4,nrtm)=irectmp_sav(4,i1)
267 msegtyp(nrtm)=irectmp_sav(5,i1)
268 IF(imbin/=0) mbinflg(nrtm)=irectmp_sav(6,i1)
269
270 DO j=ideb,nrtmp-1
271 i1=index(j)
272 i2=index(j+1)
273 IF(irectmp(1,i2)/=irectmp(1,i1).OR.
274 . irectmp(2,i2)/=irectmp(2,i1).OR.
275 . irectmp(3,i2)/=irectmp(3,i1).OR.
276 . irectmp(4,i2)/=irectmp(4,i1).OR.
277 . irectmp(5,i2)/=irectmp(5,i1))THEN ! teste msegtyp pq ya un risque si renumerotation entre les 2 phases
278
279 nrtm=nrtm+1
280 irect(1,nrtm)=irectmp_sav(1,i2)
281 irect(2,nrtm)=irectmp_sav(2,i2)
282 irect(3,nrtm)=irectmp_sav(3,i2)
283 irect(4,nrtm)=irectmp_sav(4,i2)
284 msegtyp(nrtm)=irectmp_sav(5,i2)
285 IF(imbin/=0) mbinflg(nrtm)=irectmp_sav(6,i2)
286
287 ELSEIF(irectmp(6,i1)/=irectmp(6,i2))THEN
288 IF(imbin/=0) mbinflg(nrtm)=1+2
289 END IF
290 END DO
291 END IF
292
293
294 DEALLOCATE(index,irectmp)
295 IF(ALLOCATED(irectmp_sav)) DEALLOCATE(irectmp_sav)
296
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)