49 USE reader_old_mod ,
ONLY : line, kline
53#include "implicit_f.inc"
64 INTEGER INSEG,FLAG,ICOUNT,ITER ,NSETS
66 TYPE (SURF_) ,
DIMENSION(NSURF+NSETS) :: IGRSURF
67 TYPE(
submodel_data),
DIMENSION(NSUBMOD),
INTENT(IN) :: LSUBMODEL
71 INTEGER I,J,K,L,ID,IGS,IGRS,NSEG,NSEGV,
72 . SKIPFLAG,UID,IAD_TMP,NSEG_TOT,
73 . IWORK(70000),IERROR, II
74 INTEGER,
DIMENSION(:,:) ,
ALLOCATABLE :: ITRI
75 INTEGER,
DIMENSION(:) ,
ALLOCATABLE :: INDEX,BUFTMP
77 CHARACTER(LEN=NCHARTITLE) :: TITR
78 CHARACTER(LEN=NCHARKEY) :: KEY,KEY2
79 INTEGER :: NB_IDS, NB_NEG_IDS
80 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IDS
81 LOGICAL :: IS_AVAILABLE
82 INTEGER :: NN(4),NF,IMIN,NMIN,INOD(4),NPERM(4,4),ISIGN_NOD(4),IORD
96! surf_type = 200 : infinite
99! id madymo -
for entity
type which impose surface movement:
100! no systeme madymo
for entity
type which impose surface
115! igrsurf(igs)%NSEG_R2R_SHARE :: shared on boundary subdomain
132 ALLOCATE(itri(5,inseg),stat=ierror)
133 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode
137 ALLOCATE(index(2*inseg),stat=ierror)
138 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode=aninfo,
142 ALLOCATE(buftmp(inseg),stat=ierror)
143 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode=aninfo
147 IF (flag == 0) icount=0
154 . option_titr = titr ,
164 IF (key(1:4) ==
'SURF')
THEN
167 CALL hm_get_intv(
'idsmax', nb_ids, is_available, lsubmodel)
168 CALL hm_get_intv(
'negativeIdsmax', nb_neg_ids, is_available, lsubmodel)
169 IF (nb_ids + nb_neg_ids == 0) cycle
170 ALLOCATE(ids(nb_ids + nb_neg_ids))
174 DO ii = 1, nb_neg_ids
176 ids(ii + nb_ids) = - ids(ii + nb_ids)
179 IF (flag == 0 .AND. igrsurf(igs)%NSEG == -1)
THEN
180 DO ii = 1, nb_ids + nb_neg_ids
184 IF (iabs(ids(ii)) == igrsurf(k)%ID)
THEN
190 CALL ancmsg(msgid=188, msgtype=msgwarning, anmode=aninfo,
191 . i1=id, c1=titr, i2=ids(ii))
192 ELSE IF (igrsurf(igrs)%TYPE==100 .OR. igrsurf(igrs)%TYPE==101)
THEN
193 CALL ancmsg(msgid=187, msgtype=msgerror, anmode=aninfo,
194 . i1=id, c1=titr, i2=ids(ii))
195 ELSEIF (igrsurf(igrs)%LEVEL == 0)
THEN
196 IF (iter > nsurf)
THEN
197 CALL ancmsg(msgid=189, msgtype=msgerror, anmode=aninfo,
198 . c1=
'SURFACE', c2=
'SURFACE', c3=
'SURFACE', c4=titr, c5=
'SURFACE',
199 . i1=id, i2=igrsurf(igs)%ID)
200 IF(
ALLOCATED(itri))
DEALLOCATE(itri)
201 IF(
ALLOCATED(index))
DEALLOCATE(index)
202 IF(
ALLOCATED(buftmp))
DEALLOCATE(buftmp)
212 nsegv=igrsurf(igrs)%NSEG
217 IF (skipflag == 0)
THEN
218 inseg=inseg+nisx*nseg
219 igrsurf(igs)%NSEG=nseg
220 CALL my_alloc(igrsurf(igs)%NODES,nseg,4)
221 igrsurf(igs)%NODES(1:nseg,1:4) = 0
222 CALL my_alloc(igrsurf(igs)%ELTYP,nseg)
223 igrsurf(igs)%ELTYP(1:nseg) = 0
224 CALL my_alloc(igrsurf(igs)%ELEM,nseg)
225 igrsurf(igs)%ELEM(1:nseg) = 0
228 ELSEIF (flag == 1 .AND. igrsurf(igs)%LEVEL == 0 .AND.
229 . igrsurf(igs)%NSEG > -1)
THEN
231 DO ii = 1, nb_ids + nb_neg_ids
235 IF (iabs(ids(ii)) == igrsurf(k)%ID)
THEN
241 IF (igrsurf(igrs)%NSEG == -1)
THEN
244 nsegv=igrsurf(igrs)%NSEG
250 igrsurf(igs)%NODES(nseg_tot,3) = igrsurf
251 igrsurf(igs)%NODES(nseg_tot,4) = igrsurf(igrs)%NODES(l,4)
252 igrsurf(igs)%ELTYP(nseg_tot) = igrsurf(igrs)%ELTYP(l)
253 igrsurf(igs)%ELEM(nseg_tot) = igrsurf(igrs)%ELEM(l)
258 nseg_tot = nseg_tot + 1
259 igrsurf(igs)%NODES(nseg_tot,1) = igrsurf(igrs)%NODES(l,4)
260 igrsurf(igs)%NODES(nseg_tot,2) = igrsurf(igrs)%NODES(l,3)
261 igrsurf(igs)%NODES(nseg_tot,3) = igrsurf(igrs)%NODES(l,2)
262 igrsurf(igs)%NODES(nseg_tot,4) = igrsurf(igrs)%NODES(l,1)
263 igrsurf(igs)%ELTYP(nseg_tot) = igrsurf(igrs)%ELTYP(l)
264 igrsurf(igs)%ELEM(nseg_tot) = igrsurf(igrs)%ELEM(l)
268 nseg_tot = nseg_tot + 1
269 igrsurf(igs)%NODES(nseg_tot,1) = igrsurf(igrs)%NODES(l,2)
270 igrsurf(igs)%NODES(nseg_tot
271 igrsurf(igs)%NODES(nseg_tot,3) = igrsurf(igrs)%NODES(l,3)
272 igrsurf(igs)%NODES(nseg_tot,4) = igrsurf(igrs)%NODES(l,4)
273 igrsurf(igs)%ELTYP(nseg_tot
283 ELSEIF (key(1:5) == 'dsurf
') THEN
286 CALL HM_GET_INTV('idsmax
', NB_IDS, IS_AVAILABLE, LSUBMODEL)
287 CALL HM_GET_INTV('negativeidsmax
', NB_NEG_IDS, IS_AVAILABLE, LSUBMODEL)
288 IF (NB_IDS + NB_NEG_IDS == 0) CYCLE
289 ALLOCATE(IDS(NB_IDS + NB_NEG_IDS))
291 CALL HM_GET_INT_ARRAY_INDEX('ids
', IDS(II), II, IS_AVAILABLE, LSUBMODEL)
293 DO II = 1, NB_NEG_IDS
294 CALL HM_GET_INT_ARRAY_INDEX('negativeids
', IDS(II + NB_IDS), II, IS_AVAILABLE, LSUBMODEL)
295 IDS(II + NB_IDS) = - IDS(II + NB_IDS)
298.AND.
IF (FLAG == 0 IGRSURF(IGS)%NSEG == -1) THEN
299 DO II = 1, NB_IDS + NB_NEG_IDS
300! Get surf internal id
303 IF (IABS(IDS(II)) == IGRSURF(K)%ID) THEN
309 CALL ANCMSG(MSGID=188, MSGTYPE=MSGWARNING, ANMODE=ANINFO,
310 . I1=ID, C1=TITR, I2=IDS(II))
311.OR.
ELSE IF (IGRSURF(IGRS)%TYPE==100 IGRSURF(IGRS)%TYPE==101) THEN
312 CALL ANCMSG(MSGID=187, MSGTYPE=MSGERROR, ANMODE=ANINFO,
313 . I1=ID, C1=TITR, I2=IDS(II))
314 ELSEIF (IGRSURF(IGRS)%LEVEL == 0) THEN
315 IF (ITER > NSURF) THEN
316 CALL ANCMSG(MSGID=189, MSGTYPE=MSGERROR, ANMODE=ANINFO,
317 . C1='surface
', C2='surface
', C3='surface
', C4=TITR, C5='surface
',
318 . I1=ID, I2=IGRSURF(IGS)%ID)
319 IF(ALLOCATED(ITRI)) DEALLOCATE(ITRI)
320 IF(ALLOCATED(INDEX)) DEALLOCATE(INDEX)
321 IF(ALLOCATED(BUFTMP)) DEALLOCATE(BUFTMP)
331 NSEGV=IGRSURF(IGRS)%NSEG
336 IF (SKIPFLAG == 0) THEN
337 INSEG=INSEG+NISX*NSEG
338 IGRSURF(IGS)%NSEG=NSEG
339 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEG,4)
340 IGRSURF(IGS)%NODES(1:NSEG,1:4) = 0
341 CALL MY_ALLOC(IGRSURF(IGS)%ELTYP,NSEG)
342 IGRSURF(IGS)%ELTYP(1:NSEG) = 0
343 CALL MY_ALLOC(IGRSURF(IGS)%ELEM,NSEG)
344 IGRSURF(IGS)%ELEM(1:NSEG) = 0
347.AND..AND.
ELSEIF (FLAG == 1 IGRSURF(IGS)%LEVEL == 0
348 . IGRSURF(IGS)%NSEG > -1) THEN
352 DO II = 1, NB_IDS + NB_NEG_IDS
353! Get surf internal id
356 IF (IABS(IDS(II)) == IGRSURF(K)%ID) THEN
362 IF (IGRSURF(IGRS)%NSEG == -1) THEN
365 NSEGV=IGRSURF(IGRS)%NSEG
368 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%NODES(L,1)
370 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%NODES(L,2)
372 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%NODES(L,3)
374 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%NODES(L,4)
376 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%ELTYP(L)
378 BUFTMP(IAD_TMP)=IGRSURF(IGRS)%ELEM(L)
383 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%NODES(L,1)
385 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%NODES(L,2)
387 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%NODES(L,3)
389 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%NODES(L,4)
391 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%ELTYP(L)
393 BUFTMP(IAD_TMP)= -IGRSURF(IGRS)%ELEM(L)
401! pretreatment of surface node permutation
404 IF (BUFTMP((L-1)*NISX+1) /= 0) THEN
405 ! nodes of surface segment
406 INOD(1) = IABS(BUFTMP((L-1)*NISX+1))
407 INOD(2) = IABS(BUFTMP((L-1)*NISX+2))
408 INOD(3) = IABS(BUFTMP((L-1)*NISX+3))
409 INOD(4) = IABS(BUFTMP((L-1)*NISX+4))
411 ISIGN_NOD(1) = ISIGN(1,BUFTMP((L-1)*NISX+1))
412 ISIGN_NOD(2) = ISIGN(1,BUFTMP((L-1)*NISX+2))
413 ISIGN_NOD(3) = ISIGN(1,BUFTMP((L-1)*NISX+3))
414 ISIGN_NOD(4) = ISIGN(1,BUFTMP((L-1)*NISX+4))
424 ! check for min node ID
428 IF (NMIN > INOD(J)) IMIN = J
429 NMIN = MIN(NMIN,INOD(J))
431 ! start node pemutation
432 NN(1) = INOD(NPERM(IMIN,1))
433 NN(2) = INOD(NPERM(IMIN,2))
434 NN(3) = INOD(NPERM(IMIN,3))
435 NN(4) = INOD(NPERM(IMIN,4))
436 ! permuted nodes temporary storage for further treatments (sorting, double removing)
437 BUFTMP((L-1)*NISX+1) = NN(1)*ISIGN_NOD(1)
438 BUFTMP((L-1)*NISX+2) = NN(2)*ISIGN_NOD(2)
439 BUFTMP((L-1)*NISX+3) = NN(3)*ISIGN_NOD(3)
440 BUFTMP((L-1)*NISX+4) = NN(4)*ISIGN_NOD(4)
441 ENDIF ! IF (BUFTMP((L-1)*NISX+1) /= 0)
445 ! 3 node element surface rearrangement (n4 = n3) after permutation
448 INOD(1) = BUFTMP((L-1)*NISX+1)
449 INOD(2) = BUFTMP((L-1)*NISX+2)
450 INOD(3) = BUFTMP((L-1)*NISX+3)
451 INOD(4) = BUFTMP((L-1)*NISX+4)
455.OR..OR.
IF ( INOD(1) /= 0 INOD(2) /= 0
456.OR.
. INOD(3) /= 0 INOD(4) /= 0 ) THEN
458 IF (INOD(4) == 0) INOD(4)=INOD(3)
460 IF (INOD(1) == INOD(4)) THEN
463 ELSEIF (INOD(2) == INOD(3)) THEN
466 ELSEIF(INOD(1) == INOD(2)) THEN
474 BUFTMP((L-1)*NISX+1) = INOD(1)
475 BUFTMP((L-1)*NISX+2) = INOD(2)
476 BUFTMP((L-1)*NISX+3) = INOD(3)
477 BUFTMP((L-1)*NISX+4) = INOD(4)
478 ENDIF ! IF (IORD > 0)
486 IF(BUFTMP((L-1)*NISX+1) /= 0) THEN
487 ITRI(1,L) = IABS(BUFTMP((L-1)*NISX+1))
488 ITRI(2,L) = IABS(BUFTMP((L-1)*NISX+2))
489 ITRI(3,L) = IABS(BUFTMP((L-1)*NISX+3))
490 ITRI(4,L) = IABS(BUFTMP((L-1)*NISX+4))
491 ITRI(5,L) = BUFTMP((L-1)*NISX+1) / IABS(BUFTMP((L-1)*NISX+1))
494 CALL MY_ORDERS(0,IWORK,ITRI,INDEX,NSEG,5)
500.AND.
IF( IABS(BUFTMP( (INDEX(L)-1) * NISX + 1)) == IABS(BUFTMP( (INDEX(L+1)-1) * NISX + 1))
501.AND.
. IABS(BUFTMP( (INDEX(L)-1) * NISX + 2)) == IABS(BUFTMP( (INDEX(L+1)-1) * NISX + 2))
502.AND.
. IABS(BUFTMP( (INDEX(L)-1) * NISX + 3)) == IABS(BUFTMP( (INDEX(L+1)-1) * NISX + 3))
503 . IABS(BUFTMP( (INDEX(L)-1) * NISX + 4)) == IABS(BUFTMP( (INDEX(L+1)-1) * NISX + 4)) ) THEN
504 IF( ITRI(5,INDEX(L)) + ITRI(5,INDEX(L+1)) == 0)THEN
506 BUFTMP((INDEX(L)-1) *NISX+J) = 0
507 BUFTMP((INDEX(L+1)-1)*NISX+J) = -IABS(BUFTMP((INDEX(L+1)-1)*NISX+J))
509 ELSEIF( ITRI(5,INDEX(L)) + ITRI(5,INDEX(L+1)) /= 0)THEN
511 BUFTMP((INDEX(L)-1) *NISX+J) = 0
512 BUFTMP((INDEX(L+1)-1)*NISX+J) = BUFTMP((INDEX(L+1)-1)*NISX+J)
521.OR.
IF((BUFTMP( (INDEX(L)-1) *NISX+1) > 0)
522.OR.
. (BUFTMP( (INDEX(L)-1) *NISX+2) > 0)
523.OR.
. (BUFTMP( (INDEX(L)-1) *NISX+3) > 0)
524 . (BUFTMP( (INDEX(L)-1) *NISX+4) > 0) )THEN
528 IF (NSEGV /= NSEG) THEN
529 DEALLOCATE(IGRSURF(IGS)%NODES)
530 CALL MY_ALLOC(IGRSURF(IGS)%NODES,NSEGV,4)
531 IGRSURF(IGS)%NODES(1:NSEGV,1:4) = 0
534.OR.
IF((BUFTMP( (INDEX(L)-1) *NISX+1) > 0)
535.OR.
. (BUFTMP( (INDEX(L)-1) *NISX+2) > 0)
536.OR.
. (BUFTMP( (INDEX(L)-1) *NISX+3) > 0)
537 . (BUFTMP( (INDEX(L)-1) *NISX+4) > 0) )THEN
539 IGRSURF(IGS)%NODES(NSEG_TOT,1) = BUFTMP((INDEX(L)-1) *NISX+1)
540 IGRSURF(IGS)%NODES(NSEG_TOT,2) = BUFTMP((INDEX(L)-1) *NISX+2)
541 IGRSURF(IGS)%NODES(NSEG_TOT,3) = BUFTMP((INDEX(L)-1) *NISX+3)
542 IGRSURF(IGS)%NODES(NSEG_TOT,4) = BUFTMP((INDEX(L)-1) *NISX+4)
543 IGRSURF(IGS)%ELTYP(NSEG_TOT) = BUFTMP((INDEX(L)-1) *NISX+5)
544 IGRSURF(IGS)%ELEM(NSEG_TOT) = BUFTMP((INDEX(L)-1) *NISX+6)
547 IGRSURF(IGS)%NSEG=NSEG_TOT
552.AND.
ENDIF ! IF (FLAG == 0 ISURF(2,IGS) == -1)
555 IF(ALLOCATED(ITRI)) DEALLOCATE(ITRI)
556 IF(ALLOCATED(INDEX)) DEALLOCATE(INDEX)
557 IF(ALLOCATED(BUFTMP)) DEALLOCATE(BUFTMP)
561 CALL ANCMSG(MSGID=189,
570 . I2=IGRSURF(IGS)%ID)
571 IF(ALLOCATED(ITRI)) DEALLOCATE(ITRI)
572 IF(ALLOCATED(INDEX)) DEALLOCATE(INDEX)
573 IF(ALLOCATED(BUFTMP)) DEALLOCATE(BUFTMP)
577 IF(ALLOCATED(ITRI)) DEALLOCATE(ITRI)
578 IF(ALLOCATED(INDEX)) DEALLOCATE(INDEX)
579 IF(ALLOCATED(BUFTMP)) DEALLOCATE(BUFTMP)
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)