40
41
42
43 USE my_alloc_mod
49 USE reader_old_mod , ONLY : line, kline
50
51
52
53#include "implicit_f.inc"
54
55
56
57#include "scr17_c.inc"
58#include "com01_c.inc"
59#include "com04_c.inc"
60#include "param_c.inc"
61
62
63
64 INTEGER INSEG,FLAG,ICOUNT,ITER ,NSETS
65
66 TYPE (SURF_) , DIMENSION(NSURF+NSETS) :: IGRSURF
67 TYPE(SUBMODEL_DATA), DIMENSION(NSUBMOD), INTENT(IN) :: LSUBMODEL
68
69
70
71 INTEGER I,J,K,L,ID,IGS,IGRS,JREC,IADV,NSEG,NSEGV,SRFTYP,
72 . SKIPFLAG,UID,IAD_TMP,BUFTMP_1,NSEG_TOT,
73 . IWORK(70000),IERROR, II
74 INTEGER, DIMENSION(:,:) , ALLOCATABLE :: ITRI
75 INTEGER, DIMENSION(:) , ALLOCATABLE :: INDEX,BUFTMP
76
77 CHARACTER(LEN=NCHARTITLE) :: TITR
78 CHARACTER(LEN=NCHARKEY) :: KEY,KEY2,KEY3
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
83 DATA nperm/1,2,3,4,
84 . 2,3,4,1,
85 . 3,4,1,2,
86 . 4,1,2,3/
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 ALLOCATE(itri(5,inseg),stat=ierror)
133 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode=aninfo,
134 . msgtype=msgerror,
135 . c1='SURFSURF')
136
137 ALLOCATE(index(2*inseg),stat=ierror)
138 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode=aninfo,
139 . msgtype=msgerror,
140 . c1='SURFSURF')
141
142 ALLOCATE(buftmp(inseg),stat=ierror)
143 IF(ierror/=0)
CALL ancmsg(msgid=268,anmode=aninfo,
144 . msgtype=msgerror,
145 . c1='SURFSURF')
146
147 IF (flag == 0) icount=0
148 igs =0
149
151 DO i = 1, nsurf
154 . option_titr = titr ,
155 . unit_id = uid,
156 . keyword2 = key ,
157 . keyword3 = key2)
158
159 skipflag = 0
160 nseg=0
161 kline=line
162
163 igs=igs+1
164 IF (key(1:4) == 'SURF') THEN
165 nb_ids = 0
166 nb_neg_ids = 0
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))
171 DO ii = 1, nb_ids
173 ENDDO
174 DO ii = 1, nb_neg_ids
176 ids(ii + nb_ids) = - ids(ii + nb_ids)
177 ENDDO
178
179 IF (flag == 0 .AND. igrsurf(igs)%NSEG == -1) THEN
180 DO ii = 1, nb_ids + nb_neg_ids
181
182 igrs = 0
183 DO k = 1, nsurf
184 IF (iabs(ids(ii)) == igrsurf(k)%ID) THEN
185 igrs = k
186 EXIT
187 ENDIF
188 ENDDO
189 IF (igrs == 0)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
201 IF(ALLOCATED(index)) DEALLOCATE(index)
202 IF(ALLOCATED(buftmp)) DEALLOCATE(buftmp)
203 RETURN
204 ENDIF
205
206 igrsurf(igs)%LEVEL=0
207
208 nseg = 0
209 skipflag = 1
210 EXIT
211 ELSE
212 nsegv=igrsurf(igrs)%NSEG
213 nseg =nseg+nsegv
214 ENDIF
215 ENDDO
216
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
226 ENDIF
227
228 ELSEIF (flag == 1 .AND. igrsurf(igs)%LEVEL == 0 .AND.
229 . igrsurf(igs)%NSEG > -1) THEN
230 nseg_tot = 0
231 DO ii = 1, nb_ids + nb_neg_ids
232
233 igrs = 0
234 DO k = 1, nsurf
235 IF (iabs(ids(ii)) == igrsurf(k)%ID) THEN
236 igrs = k
237 EXIT
238 ENDIF
239 ENDDO
240 IF (igrs == 0) cycle
241 IF (igrsurf(igrs)%NSEG == -1) THEN
242 EXIT
243 ELSE
244 nsegv=igrsurf(igrs)%NSEG
245 IF(ids(ii) > 0)THEN
246 DO l=1,nsegv
247 nseg_tot = nseg_tot + 1
248 igrsurf(igs)%NODES(nseg_tot,1) = igrsurf(igrs)%NODES(l,1)
249 igrsurf(igs)%NODES(nseg_tot,2) = igrsurf(igrs)%NODES(l,2)
250 igrsurf(igs)%NODES(nseg_tot,3) = igrsurf(igrs)%NODES(l,3)
251 igrsurf(igs)%NODES(nseg_tot,4) = igrsurf(igrs)%NODES(l,4)
252 igrsurf(igs
253 igrsurf(igs)%ELEM(nseg_tot) = igrsurf(igrs)%ELEM(l)
254 ENDDO
255 ELSE
256 IF(n2d==0)THEN
257 DO l=1,nsegv
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)
265 ENDDO
266 ELSE
267 DO l=1,nsegv
268 nseg_tot = nseg_tot + 1
269 igrsurf(igs)%NODES(nseg_tot,1) = igrsurf(igrs)%NODES(l,2)
270 igrsurf(igs)%NODES(nseg_tot,2) = igrsurf(igrs)%NODES(l,1)
271 igrsurf(igs)%NODES(nseg_tot,3) = igrsurf(igrs)%NODES
272 igrsurf(igs)%NODES(nseg_tot,4) = igrsurf(igrs)%NODES(l,4)
273 igrsurf(igs)%ELTYP(nseg_tot) = igrsurf(igrs)%ELTYP(l)
274 igrsurf(igs)%ELEM(nseg_tot) = igrsurf(igrs)%ELEM(l)
275 ENDDO
276 ENDIF
277 ENDIF
278 ENDIF
279 ENDDO
280 igrsurf(igs)%LEVEL=1
281 ENDIF
282 DEALLOCATE(ids)
283 ELSEIF (key(1:5) == 'DSURF') THEN
284 nb_ids = 0
285 nb_neg_ids = 0
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))
290 DO ii = 1, nb_ids
292 ENDDO
293 DO ii = 1, nb_neg_ids
295 ids(ii + nb_ids) = - ids(ii + nb_ids)
296 ENDDO
297
298 IF (flag == 0 .AND. igrsurf(igs)%NSEG == -1) THEN
299 DO ii = 1, nb_ids + nb_neg_ids
300
301 igrs = 0
302 DO k = 1, nsurf
303 IF (iabs(ids(ii)) == igrsurf(k)%ID) THEN
304 igrs = k
305 EXIT
306 ENDIF
307 ENDDO
308 IF (igrs == 0)THEN
309 CALL ancmsg(msgid=188, msgtype=msgwarning, anmode=aninfo,
310 . i1=
id, c1=titr, i2=ids(ii))
311 ELSE IF (igrsurf(igrs)%TYPE==100 .OR. 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)
322 RETURN
323 ENDIF
324 igrsurf(igs)%NSEG=-1
325 igrsurf(igs)%LEVEL=0
326 icount=1
327 nseg = 0
328 skipflag = 1
329 EXIT
330 ELSE
331 nsegv=igrsurf(igrs)%NSEG
332 nseg =nseg+nsegv
333 ENDIF
334 ENDDO
335
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
345 ENDIF
346
347 ELSEIF (flag == 1 .AND. igrsurf(igs)%LEVEL == 0 .AND.
348 . igrsurf(igs)%NSEG > -1) THEN
349 nseg = 0
350 nseg_tot = 0
351 iad_tmp = 1
352 DO ii = 1, nb_ids + nb_neg_ids
353
354 igrs = 0
355 DO k = 1, nsurf
356 IF (iabs(ids(ii)) == igrsurf(k)%ID) THEN
357 igrs = k
358 EXIT
359 ENDIF
360 ENDDO
361 IF (igrs == 0) cycle
362 IF (igrsurf(igrs)%NSEG == -1) THEN
363 EXIT
364 ELSE
365 nsegv=igrsurf(igrs)%NSEG
366 IF (ids(ii) > 0)THEN
367 DO l=1,nsegv
368 buftmp(iad_tmp)=igrsurf(igrs)%NODES(l,1)
369 iad_tmp=iad_tmp+1
370 buftmp(iad_tmp)=igrsurf(igrs)%NODES(l,2)
371 iad_tmp=iad_tmp+1
372 buftmp(iad_tmp)=igrsurf(igrs)%NODES(l,3)
373 iad_tmp=iad_tmp+1
374 buftmp(iad_tmp)=igrsurf(igrs)%NODES(l,4)
375 iad_tmp=iad_tmp+1
376 buftmp(iad_tmp)=igrsurf(igrs)%ELTYP(l)
377 iad_tmp=iad_tmp+1
378 buftmp(iad_tmp)=igrsurf(igrs)%ELEM(l)
379 iad_tmp=iad_tmp+1
380 ENDDO
381 ELSE
382 DO l=1,nsegv
383 buftmp(iad_tmp)= -igrsurf(igrs)%NODES(l,1)
384 iad_tmp=iad_tmp+1
385 buftmp(iad_tmp)= -igrsurf(igrs)%NODES(l,2)
386 iad_tmp=iad_tmp+1
387 buftmp(iad_tmp)= -igrsurf(igrs)%NODES(l,3)
388 iad_tmp=iad_tmp+1
389 buftmp(iad_tmp)= -igrsurf(igrs)%NODES(l,4)
390 iad_tmp=iad_tmp+1
391 buftmp(iad_tmp)= -igrsurf(igrs)%ELTYP(l)
392 iad_tmp=iad_tmp+1
393 buftmp(iad_tmp)= -igrsurf(igrs)%ELEM(l)
394 iad_tmp=iad_tmp+1
395 ENDDO
396 ENDIF
397 nseg=nseg+nsegv
398 ENDIF
399 ENDDO
400
401
402
403 DO l=1,nseg
404 IF (buftmp((l-1)*nisx+1) /= 0) THEN
405
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))
410
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))
415
416 nf=0
417 DO j=1,4
418 k=inod(j)
419 IF (k /= 0) THEN
420 nf=nf+1
421 inod(nf)=k
422 ENDIF
423 ENDDO
424
425 imin = 1
426 nmin = inod(imin)
427 DO j=2,nf
428 IF (nmin > inod(j)) imin = j
429 nmin =
min(nmin,inod(j))
430 ENDDO
431
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
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
442 ENDDO
443
444
445
446
447 DO l=1,nseg
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)
452
453 iord = 0
454
455 IF ( inod(1) /= 0 .OR. inod(2) /= 0 .OR.
456 . inod(3) /= 0 .OR. inod(4) /= 0 ) THEN
457
458 IF (inod(4) == 0) inod(4)=inod(
459
460 IF (inod(1) == inod(4)) THEN
461 inod(4)=inod(3)
462 iord = iord + 1
463 ELSEIF (inod(2) == inod(3)) THEN
464 inod(3)=inod(4)
465 iord = iord + 1
466 ELSEIF(inod(1) == inod(2)) THEN
467 inod(2)=inod(3)
468 inod(3)=inod(4)
469 iord = iord + 1
470 ENDIF
471 ENDIF
472
473 IF (iord > 0) 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
479 ENDDO
480
481
482
483
484 DO l=1,nseg
485 index(l)=l
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))
492 ENDIF
493 ENDDO
494 CALL my_orders(0,iwork,itri,index,nseg,5)
495
496
497
498 l = 1
499 DO WHILE( l < nseg)
500 IF( iabs(buftmp( (index(l)-1) * nisx + 1)) == iabs(buftmp( (index(l+1)-1) * nisx + 1)) .AND.
501 . iabs(buftmp( (index(l)-1) * nisx + 2)) == iabs(buftmp( (index(l+1)-1) * nisx + 2)).AND.
502 . iabs(buftmp( (index(l)-1) * nisx + 3)) == iabs(buftmp( (index(l+1)-1) * nisx + 3)).AND.
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
505 DO j=1,nisx
506 buftmp((index(l)-1) *nisx+j) = 0
507 buftmp((index(l+1)-1)*nisx+j) = -iabs(buftmp((index(l+1)-1)*nisx+j))
508 ENDDO
509 ELSEIF( itri(5,index(l)) + itri(5,index(l+1)) /= 0)THEN
510 DO j=1,nisx
511 buftmp((index(l)-1) *nisx+j) = 0
512 buftmp((index(l+1)-1)*nisx+j) = buftmp((index(l+1)-1)*nisx+j)
513 ENDDO
514 ENDIF
515 END IF
516 l = l + 1
517 ENDDO
518
519 nsegv = 0
520 DO l=1,nseg
521 IF((buftmp( (index(l)-1) *nisx+1) > 0) .OR.
522 . (buftmp( (index(l)-1) *nisx+2) > 0) .OR.
523 . (buftmp( (index(l)-1) *nisx+3) > 0) .OR.
524 . (buftmp( (index(l)-1) *nisx+4) > 0) )THEN
525 nsegv=nsegv+1
526 ENDIF
527 ENDDO
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
532 ENDIF
533 DO l=1,nseg
534 IF((buftmp( (index(l)-1) *nisx+1) > 0) .OR.
535 . (buftmp( (index(l)-1) *nisx+2) > 0) .OR.
536 . (buftmp( (index(l)-1) *nisx+3) > 0) .OR.
537 . (buftmp( (index(l)-1) *nisx+4) > 0) )THEN
538 nseg_tot=nseg_tot+1
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)
545 ENDIF
546 ENDDO
547 igrsurf(igs)%NSEG=nseg_tot
548 igrsurf(igs)%LEVEL=1
549
550 ENDIF
551 DEALLOCATE(ids)
552 ENDIF
553 ENDDO
554
555 IF(ALLOCATED(itri)) DEALLOCATE(itri)
556 IF(ALLOCATED(index)) DEALLOCATE(index)
557 IF(ALLOCATED(buftmp)) DEALLOCATE(buftmp)
558
559 RETURN
560 900 CONTINUE
562 . msgtype=msgerror,
563 . anmode=aninfo,
564 . c1='SURFACE',
565 . c2='SURFACE',
566
567 . c3='SURFACE',
568 . c4=titr,
569 . c5='SURFACE',
570 . i2=igrsurf(igs)%ID)
571 IF(ALLOCATED(itri)) DEALLOCATE(itri)
572 IF(ALLOCATED(index)) DEALLOCATE(index)
573 IF(ALLOCATED(buftmp)) DEALLOCATE(buftmp)
574
575 RETURN
576
577 IF(ALLOCATED(itri)) DEALLOCATE(itri)
578 IF(ALLOCATED(index)) DEALLOCATE(index)
579 IF(ALLOCATED(buftmp)) DEALLOCATE(buftmp)
580 RETURN
subroutine hm_get_int_array_index(name, ival, index, is_available, lsubmodel)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
integer, parameter nchartitle
integer, parameter ncharkey
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)