51
52
53
54 USE my_alloc_mod
56 USE rbmerge_mod , ONLY : rbmerge_
61
62
63
64#include "implicit_f.inc"
65
66
67
68#include "scr17_c.inc"
69#include "com04_c.inc"
70#include "units_c.inc"
71#include "param_c.inc"
72
73
74
75 INTEGER :: SMGRBY
76 INTEGER MGRBY(NMGRBY,SMGRBY),NPBY(NNPBY,*),LPBY(*),,ITABM1(*),ITAB(*)
78 INTEGER NOM_OPT(LNOPT1,*),PTR_NOPT_RBMERGE
79 INTEGER IGRV(NIGRV,*),IBGR(*)
80 TYPE(SUBMODEL_DATA),INTENT(IN)::LSUBMODEL()
81
82 TYPE (GROUP_) , DIMENSION(NGRNOD) :: IGRNOD
83
84
85
86 INTEGER I,J,K,L,ID,IRBM,IRBS,NBMERGE,IGS,
87 . N,NOPT,UID, II, NOBJ
88 INTEGER IMAIN,ISECONDARY,FLAGG_OPT, FLAG_BOUCLE, FLAG_ERROR,
89 . FLAG_DOUBLON, FLAG_DOUBLEMAIN, M_TYPE, S_TYPE, ID_OPT,
90 . IDNODE, NN, PRT_OPT, IDBOUCLE, LEVEL
91 INTEGER, DIMENSION(:) , ALLOCATABLE :: INDEX
92 INTEGER, DIMENSION(:,:) , ALLOCATABLE :: INUM
93 INTEGER, DIMENSION(:) , ALLOCATABLE ::
94 INTEGER, DIMENSION(:) , ALLOCATABLE :: NSECONDARY
95 INTEGER, DIMENSION(:) , ALLOCATABLE :: TAG1
96 INTEGER, DIMENSION(:) , ALLOCATABLE :: TAG2
97 INTEGER, DIMENSION(:) , ALLOCATABLE :: TABBOUCLE
98 INTEGER, DIMENSION(:,:) , ALLOCATABLE :: TABRB
99
100 CHARACTER MYSTRING*100,MYLOOP*200
101 CHARACTER MESS*40,MESS2*40
102 CHARACTER(LEN=nchartitle) :: TITR
103 CHARACTER(LEN=ncharkey) :: KEY2
104 TYPE(RBMERGE_), DIMENSION(:), ALLOCATABLE :: RBMERGE
105 INTEGER, DIMENSION(:), ALLOCATABLE :: ITAG, WORK
106 INTEGER IWORK(70000)
107 LOGICAL IS_AVAILABLE
108
109
110
111 INTEGER USR2SYS,NODGRNR5
112
113 DATA mess/'RIGID BODY MERGE DEFINITION '/
114
115 ALLOCATE(itag(numnod),work(numnod))
116 CALL my_alloc(tabrb,nrbykin,2)
117 CALL my_alloc(nb_main,nrbykin)
118 CALL my_alloc(nsecondary,nrbykin)
119 CALL my_alloc(tag1,nrbykin)
120 CALL my_alloc(tag2,nrbykin)
121 CALL my_alloc(tabboucle,nrbykin+1)
122 j = 0
123 n = 0
124 nopt = 0
125 nobj = 0
126
127
128
129 is_available = .false.
131
132 DO i=1,nrbmerge
133
134
135
136 CALL hm_option_read_key(lsubmodel, option_id =
id, unit_id = uid, option_titr = titr, keyword2 = key2)
137
138
139
140 nopt=nopt+1
141 nom_opt(1,ptr_nopt_rbmerge+nopt)=
id
142 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,ptr_nopt_rbmerge+nopt),ltitr)
143
144
145
146 CALL hm_get_intv(
'NB_SUBOBJVE',nobj,is_available,lsubmodel)
147
148 DO j=1,nobj
154 IF (imain /= 0) THEN
155 n = n + 1
156 IF(m_type == 0) m_type=1
157 IF(s_type == 0) s_type=1
158 IF(flagg_opt == 0) flagg_opt=2
159 mgrby(1,n)=imain
160 mgrby(2,n)=m_type
161 mgrby(3,n)=isecondary
162 mgrby(4,n)=s_type
163 mgrby(5,n)=flagg_opt
165 mgrby(7,n)=nopt
166 ENDIF
167 ENDDO
168 ENDDO
169
170 ALLOCATE (rbmerge(nrbykin))
171 DO i=1,nrbykin
172 ALLOCATE (rbmerge(i)%IDSECONDARY(nrbykin))
173 rbmerge(i)%NBSECONDARY=0
174 ALLOCATE (rbmerge(i)%NODE(nxtra_node))
175 ALLOCATE (rbmerge(i)%FLAG_NODE(nxtra_node))
176 rbmerge(i)%NNODE=0
177 rbmerge(i)%LEVEL=0
178 rbmerge(i)%FLAG_MAIN = 0
179 ENDDO
180
181
182 nbmerge = 0
183 tabrb(:,:)=0
184 tag1(:)=0
185 tag2(:)=0
186 flag_error = 0
187 nb_main(:)=0
188 itag(1:numnod) = 0
189 flag_doublon=0
190
191 WRITE(iout,1000)
192 prt_opt=0
193
194 DO i=1,smgrby
195 imain = mgrby(1,i)
196 m_type = mgrby(2,i)
197 isecondary = mgrby(3,i)
198 s_type = mgrby(4,i)
199 flagg_opt = mgrby(5,i)
200 id_opt = mgrby(6,i)
201 IF(s_type == 1) THEN
202
203 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,ptr_nopt_rbmerge+mgrby(7,i)),ltitr)
204
205 IF(prt_opt /= mgrby(6,i)) THEN
206 WRITE(iout,1100) mgrby(6,i),trim(titr)
207 prt_opt = mgrby(6,i)
208 ENDIF
209
210
211
212 irbm=0
213 DO k=1,nrbykin
214 IF (imain == npby(6,k)) THEN
215 irbm=k
216 EXIT
217 ENDIF
218 ENDDO
219 IF (irbm == 0)THEN
221 . msgtype=msgerror,
222 . anmode=aninfo,
223 . i1=id_opt,
224 . c1=titr,
225 . i2=imain)
226 ENDIF
227
228 irbs=0
229 DO k=1,nrbykin
230 IF (isecondary == npby(6,k)) THEN
231 irbs=k
232 EXIT
233 ENDIF
234 ENDDO
235 IF (irbs == 0)THEN
237 . msgtype=msgerror,
238 . anmode=aninfo,
239 . i1=id_opt,
240 . c1=titr,
241 . i2=isecondary)
242 ENDIF
243
244
245
246 IF((irbm /= 0).AND.(irbs /= 0)) THEN
247
248 WRITE(iout,1200) imain, isecondary, flagg_opt
249 mess2 ='SECONDARY RIGID BODY '
250
251 flag_doublon=0
252 flag_doublemain = 0
253 IF(nb_main(irbs) >= 1) THEN
254 DO l=1,nbmerge
255 IF(tabrb(l,2) == irbs) THEN
256 IF(tabrb(l,1) /= irbm) THEN
258 . msgtype=msgerror,
259 . anmode=aninfo_blind_1,
260 . i1=id_opt,
261 . c1=titr,
262 . i2=isecondary)
263 flag_doublemain = 1
264 flag_error = 1
265 ELSE
267 . msgtype=msgwarning,
268 . anmode=aninfo_blind_1,
269 . i1=id_opt,
270 . c1=titr,
271 . i2=imain,
272 . c2=mess2,
273 . i3=isecondary,
274 . i4=flagg_opt)
275 flag_doublon = 1
276 ENDIF
277 ENDIF
278 ENDDO
279 ENDIF
280 IF((flag_doublon + flag_doublemain) == 0) THEN
281 nbmerge = nbmerge + 1
282 nb_main(irbs) = nb_main(irbs) + 1
283 nsecondary(irbm) = nsecondary(irbm) + 1
284 tabrb(nbmerge,1) = irbm
285 tabrb(nbmerge,2) = irbs
286
287 rbmerge(irbs)%ID = isecondary
288 rbmerge(irbs)%IMAIN = irbm
289 rbmerge(irbs)%FLAG_MAIN = flagg_opt
290
291 rbmerge(irbm)%ID = imain
292 rbmerge(irbm)%NBSECONDARY = rbmerge(irbm)%NBSECONDARY+1
293 rbmerge(irbm)%IDSECONDARY(rbmerge(irbm)%NBSECONDARY) = irbs
294 ELSEIF(flag_doublon == 1) THEN
295 rbmerge(irbs)%FLAG_MAIN = flagg_opt
296 ENDIF
297 ENDIF
298 ENDIF
299 ENDDO
300
301 DO i=1,smgrby
302 imain = mgrby(1,i)
303 m_type = mgrby(2,i)
304 isecondary = mgrby(3,i)
305 s_type = mgrby(4,i)
306 flagg_opt = mgrby(5,i)
307 id_opt = mgrby(6,i)
308 IF((s_type == 2).OR.(s_type == 3)) THEN
309
310 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,ptr_nopt_rbmerge+mgrby(7,i)),ltitr)
311
312 IF(prt_opt /= mgrby(6,i)) THEN
313 WRITE(iout,1100) mgrby(6,i),trim(titr)
314 prt_opt = mgrby(6,i)
315 ENDIF
316
317
318
319 irbm=0
320 DO k=1,nrbykin
321 IF (imain == npby(6,k)) THEN
322 irbm=k
323 EXIT
324 ENDIF
325 ENDDO
326 IF (irbm == 0)THEN
328 . msgtype=msgerror,
329 . anmode=aninfo,
330 . i1=id_opt,
331 . c1=titr,
332 . i2=imain)
333 ENDIF
334
335 idnode=0
336 nn=0
337 IF(s_type == 2) THEN
338 idnode =
usr2sys(mgrby(3,i),itabm1,mess,
id)
339 ELSEIF(s_type == 3) THEN
340 nn =
nodgrnr5(mgrby(3,i),igs,work,igrnod,itabm1,mess)
341 ENDIF
342
343
344 IF((irbm /= 0).AND.(idnode /= 0)) THEN
345
346 WRITE(iout,1300) imain, isecondary, flagg_opt
347 mess2 ='SECONDARY NODE '
348
349 IF(itag(idnode) == 0) THEN
350 itag(idnode) = irbm
351 ELSEIF(itag(idnode) == irbm) THEN
352 flag_doublon = 1
354 . msgtype=msgwarning,
355 . anmode=aninfo_blind_1,
356 . i1=id_opt,
357 . c1=titr,
358 . i2=imain,
359 . c2=mess2,
360 . i3=isecondary,
361 . i4=flagg_opt)
362 ENDIF
363
364 IF(flag_doublon == 0) THEN
365 rbmerge(irbm)%ID = imain
366 rbmerge(irbm)%NNODE = rbmerge(irbm)%NNODE+1
367 rbmerge(irbm)%NODE(rbmerge(irbm)%NNODE) = idnode
368 rbmerge(irbm)%FLAG_NODE(rbmerge(irbm)%NNODE) = flagg_opt
369 ELSE
370 DO ii=1,rbmerge(irbm)%NNODE
371 IF(rbmerge(irbm)%NODE(ii) == idnode) THEN
372 rbmerge(irbm)%FLAG_NODE(ii) = flagg_opt
373 ENDIF
374 ENDDO
375 ENDIF
376 ENDIF
377
378 IF((irbm /= 0).AND.(nn /= 0)) THEN
379
380 WRITE(iout,1400) imain, isecondary, flagg_opt
381 WRITE(iout,1410) (itab(work(j)),j=1,nn)
382 mess2 ='SECONDARY NODE '
383
384 rbmerge(irbm)%ID = imain
385 DO j=1,nn
386 flag_doublon = 0
387 flag_doublemain = 0
388 IF(itag(work(j)) == 0) THEN
389 itag(work(j)) = irbm
390 ELSEIF(itag(work(j)) == irbm) THEN
391 flag_doublon = 1
393 . msgtype=msgwarning,
394 . anmode=aninfo_blind_1,
395 . i1=id_opt,
396 . c1=titr,
397 . i2=imain,
398 . c2=mess2,
399 . i3=itab(work(j)),
400 . i4=flagg_opt)
401 ENDIF
402
403 IF(flag_doublon == 0) THEN
404 rbmerge(irbm)%ID = imain
405 rbmerge(irbm)%NNODE = rbmerge(irbm)%NNODE+1
406 rbmerge(irbm)%NODE(rbmerge(irbm)%NNODE) = work(j)
407 rbmerge(irbm)%FLAG_NODE(rbmerge(irbm)%NNODE) = flagg_opt
408 ELSE
409 DO ii=1,rbmerge(irbm)%NNODE
410 IF(rbmerge(irbm)%NODE(ii) == work(j)) THEN
411 rbmerge(irbm)%FLAG_NODE(ii) = flagg_opt
412 ENDIF
413 ENDDO
414 ENDIF
415 ENDDO
416
417 ENDIF
418 ENDIF
419
420 ENDDO
421
422
423
424 DO i=1,nrbykin
425 IF(rbmerge(i)%NNODE > 0) THEN
426 ALLOCATE(index(2*rbmerge(i)%NNODE))
427 index(1:2*rbmerge(i)%NNODE) = 0
428 ALLOCATE(inum(rbmerge(i)%NNODE,2))
429 DO j=1,rbmerge(i)%NNODE
430 index(j) = j
431 inum(j,1) = rbmerge(i)%FLAG_NODE(j)
432 inum(j,2) = rbmerge(i)%NODE(j)
433 ENDDO
434 CALL my_orders(0,iwork,rbmerge(i)%FLAG_NODE,index,rbmerge(i)%NNODE,1)
435 DO j=1,rbmerge(i)%NNODE
436 rbmerge(i)%FLAG_NODE(j) = inum(index(j),1)
437 rbmerge(i)%NODE(j) = inum(index(j),2)
438 ENDDO
439 DEALLOCATE(index)
440 DEALLOCATE(inum)
441 ENDIF
442 ENDDO
443
444
445
446 WRITE(iout,2000)
447
448
449
450 DO i=1,nrbykin
451 IF(nb_main(i) == 0) THEN
453 ENDIF
454 ENDDO
455
456 DO i=1,nrbykin
457 IF((tag1(i) == 0).AND.(tag2(i) == 0).AND.(rbmerge(i)%NBSECONDARY>0)) THEN
458 flag_boucle = 0
459 idboucle = 0
460 tabboucle(:) = 0
461 CALL rbtag2down(i,tag2,rbmerge,flag_boucle,tabboucle,idboucle)
462 IF (flag_boucle == 1) THEN
463 WRITE(myloop,*) tabboucle(1)
464 myloop = adjustl(myloop)
465 DO j=2,nrbykin+1
466 IF(tabboucle(j) == 0) EXIT
467 WRITE(mystring,*) tabboucle(j)
468 mystring = adjustl(mystring)
469 myloop = myloop(1:len(trim(myloop))) //' -> '// mystring
470 ENDDO
472 . msgtype=msgerror,
473 . anmode=aninfo_blind_1,
474 . c1=myloop,
475 . prmod=msg_cumu)
476 flag_error = 1
477 ENDIF
478 ENDIF
479 ENDDO
480 IF(flag_error == 1) THEN
482 . msgtype=msgerror,
483 . anmode=aninfo_blind_1,
484 . prmod=msg_print)
485 ENDIF
486
487
488
489 IF(flag_error == 0) THEN
490 DO i=1,nrbykin
491 IF(nb_main(i) == 0) THEN
492 level = 0
494 ENDIF
495 ENDDO
496
497
498
500 . rby ,nom_opt, itab,ibgr,igrv)
501 ENDIF
502
503 DEALLOCATE(rbmerge,work,itag)
504 DEALLOCATE(tabrb)
505 DEALLOCATE(nb_main)
506 DEALLOCATE(nsecondary)
507 DEALLOCATE(tag1)
508 DEALLOCATE(tag2)
509 DEALLOCATE(tabboucle)
510
511 RETURN
512
5131000 FORMAT(/
514 . ' RIGID BODY MERGE DEFINITIONS '/
515 . ' ---------------------- '/)
5161100 FORMAT( /5x,'RIGID BODY MERGE ID ',i10,1x,a)
5171200 FORMAT(/10x,'MAIN RIGID BODY ID '
518 . /10x,'SECONDARY RIGID BODY ID ',i10
519 . /10x,'IFLAG ',i10)
5201300 FORMAT(/10x,'MAIN RIGID BODY ID ',i10
521 . /10x,'SECONDARY NODE ID ',i10
522 . /10x,'IFLAG ',i10)
5231400 FORMAT(/10x,'MAIN RIGID BODY ID ',i10
524 . /10x,'SECONDARY SET OF NODE ID ',i10
525 . /10x,'IFLAG ',i10
526 . /10x,'SET OF NODES ')
5271410 FORMAT( 10x,10i10)
5282000 FORMAT(/
529 . ' RIGID BODY MERGE CONSTRUCTION '/
530 . ' ---------------------- '/)
531
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)
recursive subroutine rbleveldown(npby, rbmerge, idrb, level)
recursive subroutine rbtag1down(tabrb, idrb, tag1, nbmerge)
subroutine trirbmerge(rbmerge, npby, lpby, slrbody, rby, nom_opt, itab, ibgr, igrv)
recursive subroutine rbtag2down(idrb, tag2, rbmerge, flag_boucle, tabboucle, idboucle)
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)
integer function usr2sys(iu, itabm1, mess, id)