56
57
58
59
60
61 USE my_alloc_mod
68 USE sensor_mod
70
71
72
73#include "implicit_f.inc"
74
75
76
77#include "analyse_name.inc"
78
79
80
81#include "com04_c.inc"
82#include "units_c.inc"
83#include "scr17_c.inc"
84#include "scr03_c.inc"
85#include "param_c.inc"
86#include "r2r_c.inc"
87#include "sphcom.inc"
88#include "sms_c.inc"
89
90
91
92 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
93 INTEGER NPBY(NNPBY,*), LPBY(*), ITAB(*), ITABM1(*)
94 INTEGER IBFV(NIFV,*)
95 INTEGER IGRV(NIGRV,*),IBGR(*),IMERGE(*),
96 . ISKN(LISKN,*),NUMSL,
97 . (*),KNOD2ELC(*),KNOD2ELTG(*),KNOD2EL1D(*),KNOD2ELQ(*),
98 . ITAGND(*),ICDNS10(*), ICFIELD(SIZFIELD,*), LCFIELD(*)
100 INTEGER NOM_OPT(LNOPT1,*)
101
102 TYPE (GROUP_) , DIMENSION(NGRNOD) :: IGRNOD
103 TYPE (SURF_) ,TARGET, DIMENSION(NSURF) :: IGRSURF
104 TYPE (SUBMODEL_DATA),INTENT(IN)::LSUBMODEL(*)
105 TYPE (SENSORS_) ,INTENT(IN) :: SENSORS
106
107
108
109 INTEGER I, J, K, N, NSL, NSL0, NSKEW, IC,
110 . ISPHER, IGU,IGS,ISENS,ID,ICDG,
111 . JC,UID,IFLAGUNIT,SUB_INDEX,NRB,
112 . IFAIL,NRB_R2R
113 INTEGER IDSURF, ISU, NN, IAD, M, IOPT, IEXPAMS, NEL
114 CHARACTER MESS*40
115 CHARACTER(LEN=NCHARTITLE)::TITR,TITR1
116 CHARACTER(LEN=NCHARKEY)::
117 my_real bid, mass, i1, i2, i3, i12, i23, i13, fn, ft, expn, expt
118 INTEGER, DIMENSION(:), ALLOCATABLE :: ITAG
119 INTEGER, DIMENSION(:,:), ALLOCATABLE :: TABSL
120 INTEGER, DIMENSION(:), POINTER :: INGR2USR
121 LOGICAL IS_AVAILABLE
122
123
124
125 INTEGER USR2SYS,NGR2USR,NODGRNR6
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163 DATA mess/'RIGID BODY DEFINITION '/
164
165 IF (numsl > 0) THEN
166 CALL my_alloc(tabsl,2,numsl)
167 tabsl=0
168 END IF
169
170 WRITE(iout,1000)
171
172
173
174 is_available = .false.
176
177 CALL my_alloc(itag,numnod)
178 itag(1:numnod) = 0
179
180 k=0
181 nrb=0
182 nrb_r2r=0
183
184 DO n=1,nrbody
185
186
187
188
189
190 nrb_r2r = nrb_r2r + 1
191 IF (nsubdom > 0) THEN
193 ENDIF
194
195 key=''
198 . unit_id = uid,
199 . option_titr = titr,
200 . keyword2 = key,
201 . submodel_index = sub_index)
202 IF(key=='')THEN
203 nrb = nrb + 1
204
205 iflagunit = 0
206 DO j=1,unitab%NUNITS
207 IF (unitab%UNIT_ID(j) == uid) THEN
208 iflagunit = 1
209 EXIT
210 ENDIF
211 ENDDO
212 IF (uid/=0.AND.iflagunit == 0) THEN
213 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
214 . i2=uid,i1=
id,c1='rigid body
',
215 . C2='rigid body',
216 . C3=TITR)
217 ENDIF
218
219 NOM_OPT(1,NRB)=ID
220 CALL FRETITL(TITR,NOM_OPT(LNOPT1-LTITR+1,NRB),LTITR)
221
222 CALL HM_GET_INTV('node_id',NPBY(1,NRB),IS_AVAILABLE,LSUBMODEL)
223 CALL HM_GET_INTV('sens_id',ISENS,IS_AVAILABLE,LSUBMODEL)
224 CALL HM_GET_INTV('skew_id',NSKEW,IS_AVAILABLE,LSUBMODEL)
225 CALL HM_GET_INTV('ispher',ISPHER,IS_AVAILABLE,LSUBMODEL)
226 CALL HM_GET_INTV('grnd_id',IGU,IS_AVAILABLE,LSUBMODEL)
227 CALL HM_GET_INTV('ikrem',ikrem,is_available,lsubmodel)
228 CALL hm_get_intv(
'ICoG',icdg,is_available,lsubmodel)
229 CALL hm_get_intv(
'surf_ID',idsurf,is_available,lsubmodel)
230 CALL hm_get_floatv(
'Mass',mass,is_available,lsubmodel,unitab)
231
232 IF(ispher == 0) ispher=2
233 IF(icdg == 0)icdg=1
234
235 IF(nskew == 0 .AND. sub_index /= 0 ) nskew = lsubmodel(sub_index)%SKEW
237 IF(nskew == iskn(4,j+1)) THEN
238 nskew=j+1
239 GO TO 100
240 ENDIF
241 ENDDO
242 CALL ancmsg(msgid=137,anmode=aninfo,msgtype=msgerror,
243 . c1='RIGID BODY',
244 . c2='RIGID BODY',
245 . i2=nskew,i1=
id,c3=titr)
246 100 CONTINUE
247
248 rby(1,nrb) = mass
249
250 isu=0
251 IF (idsurf/=0) THEN
252 ingr2usr => igrsurf(1:nsurf)%ID
253 isu=
ngr2usr(idsurf,ingr2usr,nsurf)
254 IF (isu == 0) THEN
255 CALL ancmsg(msgid=158,anmode=aninfo,msgtype=msgerror,
256 . i2=idsurf,i1=
id,c1=titr)
257 ELSEIF (igrsurf(isu)%TYPE/=101) THEN
258 titr1 = igrsurf(igs)%TITLE
259 CALL ancmsg(msgid=159,anmode=aninfo,msgtype=msgerror,
260 . i2=idsurf,c2=titr1,i1=
id,c1=titr)
261 ENDIF
262 ENDIF
263 npby(8,nrb)=isu
264
268 rby(2,nrb) = i1
269 rby(3,nrb) = i2
270 rby(4,nrb) = i3
274
275 CALL hm_get_intv(
'Ioptoff',iopt,is_available,lsubmodel)
276 CALL hm_get_intv(
'Iexpams',iexpams,is_available,lsubmodel)
277
278 CALL hm_get_intv(
'Ifail',ifail,is_available,lsubmodel)
279 npby(18,nrb)=ifail
280 IF(ifail==1)THEN
283 CALL hm_get_floatv(
'expN',expn,is_available,lsubmodel,unitab)
284 CALL hm_get_floatv(
'expT',expt,is_available,lsubmodel,unitab)
285 IF(fn==zero)fn=ep20
286 IF(ft==zero)ft=ep20
287 IF(expn==zero) expn=two
288 IF(expt==zero) expt=two
289 rby(26,nrb)=fn
290 rby(27,nrb)=ft
291 rby(28,nrb)=expn
292 rby(29,nrb)=expt
293 END IF
294
295 rby(5,nrb) = i12
296 rby(6,nrb) = i23
297 rby(7,nrb) = i13
298 npby(1,nrb)=
usr2sys(npby(1,nrb),itabm1,mess,
id)
299
301 IF (npby(1,nrb) == imerge(
jc)) npby(1,nrb)=imerge(numcnod+
jc)
302 ENDDO
303 CALL anodset(npby(1,nrb), check_rb_m)
304
305 npby(11,nrb)=k
306 m = npby(1,nrb)
307 nsl =
nodgrnr6(m,igu,igs,lpby(k+1),igrnod,itabm1,mess,
id)
308
309 DO i=1,nsl
310 itag(lpby(k+i)) = 1
311 ENDDO
312
313 IF (ns10e > 0 ) THEN
315 m = npby(1,nrb)
316 IF (itagnd(m)/=0) THEN
318 . msgtype=msgerror,
319 . anmode=aninfo,
320 . i1=itab(m),
321 . c1='RBODY',
323 . c2='RBODY')
324 END IF
325 END IF
326 npby(2,nrb)=nsl
327 npby(19,nrb)=nsl
328 DO j=1, nsl
329 CALL anodset(lpby(j+k), check_rb_s)
330 tabsl(1,j+k)=itab(lpby(j+k))
331 tabsl(2,j+k)=n
332 ENDDO
333
334 IF(isens > 0)THEN
335 DO i=1,sensors%NSENSOR
336 IF (isens == sensors%SENSOR_TAB(i)%SENS_ID) npby(4,nrb)=i
337 ENDDO
338 IF(npby(4,nrb) == 0)THEN
339 titr1 = igrsurf(igs)%TITLE
340 CALL ancmsg(msgid=159,anmode=aninfo,msgtype=msgerror,
341 . i2=isens,c2=titr1,i1=
id,c1=titr)
342 ENDIF
343 rby(1,nrb)=zero
344 rby(2,nrb)=zero
345 rby(3,nrb)=zero
346 rby(4,nrb)=zero
347 rby(5,nrb)=zero
348 rby(6,nrb)=zero
349 rby(7,nrb)=zero
350 nskew=0
351 icdg =0
352 ikrem=1
353 ENDIF
354 npby(5,nrb)=ispher
356 npby(17,nrb)=ikrem
357 IF(isens == 0)THEN
358 npby(7,nrb)=1
359 ELSE
360 npby(7,nrb)=0
361 ENDIF
362 npby(3,nrb) =icdg
363 npby(9,nrb) =nskew
364 IF(iexpams==0)THEN
365 iexpams=1
366 ELSEIF(iexpams==2)THEN
367 iexpams=0
368 END IF
369 npby(10,nrb)=iexpams
370 nsl0 = nsl
371 IF (nsubdom > 0) nsl0 = igrnod(igs)%R2R_ALL
372 IF (nsl0 == 0) THEN
374 . msgtype=msgwarning,
375 . anmode=aninfo_blind_2,
377 . c1=titr)
378 ENDIF
379
380 CALL spmdset(nrb,npby,nnpby,lpby,nsl,k)
381
382 IF(isms==0)THEN
383 IF (isens/=0) THEN
384 WRITE(iout,1100)
id,trim(titr),isens,itab(npby(1,nrb)),nsl,
385 . idsurf,ispher
386 ELSE
387 WRITE(iout,1111)
id,trim(titr),itab(npby(1,nrb)),nsl,
388 . idsurf,iskn(4,nskew),ispher,ikrem,icdg,
389 . (rby(j,nrb),j=1,7)
390 ENDIF
391 ELSE
392 IF (isens/=0) THEN
393 WRITE(iout,1102)
id,trim(titr),isens,itab(npby(1,nrb)),nsl,
394 . idsurf,ispher
395 ELSE
396 WRITE(iout,1112)
id,trim(titr),itab(npby(1,nrb)),nsl,
397 . idsurf,iskn(4,nskew),ispher,ikrem,icdg,
398 . (rby(j,nrb),j=1,7)
399 ENDIF
400 WRITE(iout,1103)
401 END IF
402 IF(ifail==1)THEN
403 WRITE(iout,1151)
404 WRITE(iout,1152) fn, expn, ft, expt
405 END IF
406 WRITE(iout,1201)
407 WRITE(iout,1202) (itab(lpby(i+k)),i=1,nsl)
408 k=k+nsl
409
410
411
412 DO j=1,nfxvel
413 IF(iabs(ibfv(1,j)) == npby(1,nrb).AND.
414 . ibfv(2,j)-10*(ibfv(2,j)/10)>=4)THEN
415 ibfv(6,j)=n
416 ENDIF
417 ENDDO
418
419
420
421 nel=knod2els(npby(1,nrb)+1) -knod2els(npby(1,nrb))
422 . +knod2elc(npby(1,nrb)+1) -knod2elc(npby(1,nrb))
423 . +knod2eltg(npby(1,nrb)+1)-knod2eltg(npby(1,nrb))
424 . +knod2el1d(npby(1,nrb)+1)-knod2el1d(npby(1,nrb))
425 . +knod2elq(npby(1,nrb)+1)-knod2elq(npby(1,nrb))
426 IF(nel/=0)THEN
427 IF(isms==0)THEN
429 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,nrb),ltitr)
431 . msgtype=msgwarning,
432 . anmode=aninfo_blind_2,
433 . i1=itab(npby(1,nrb)),
435 . c1=titr)
436 ELSE
438 CALL fretitl2(titr,nom_opt(lnopt1-ltitr+1,nrb),ltitr)
440 . msgtype=msgerror,
441 . anmode=aninfo_blind_1,
442 . i1=itab(npby(1,nrb)),
444 . c1=titr)
445 END IF
446 END IF
447 END IF
448 ENDDO
449
450
451
452 CALL udouble(npby(6,1),nnpby,nrbykin,mess,0,bid)
453
454
455
456 ic = 442
457 i = 0
458 CALL newdbl(npby(1,1),nnpby,nrbykin,itab,442,aninfo_blind_1,
459 . nom_opt)
460
461
462
463
464 DO i=1,numnod
465 itag(i)=0
466 ENDDO
467 k=0
468 DO n=1,nrbykin
469 nsl=npby(2,n)
470 IF(npby(7,n)/=0)THEN
471 DO i=1,nsl
472 itag(lpby(i+k))=1
473 ENDDO
474 ENDIF
475 k=k+nsl
476 ENDDO
477
478 DO k=1,ngrav
479 nn =igrv(1,k)
480 iad=igrv(4,k)
481 DO i=1,nn
482 n=ibgr(i+iad-1)
483 IF(itag(n) == 1)ibgr(i+iad-1) = -n
484 ENDDO
485 ENDDO
486
487 DO k=1,nloadc
488 nn = icfield(1,k)
489 iad = icfield(4,k)
490 DO i=1,nn
491 n=lcfield(iad+i-1)
492 IF(itag(n) == 1)lcfield(iad+i-1) = -n
493 END DO
494 ENDDO
495
496 IF(ALLOCATED(itag)) DEALLOCATE(itag)
497 IF(ALLOCATED(tabsl))DEALLOCATE(tabsl)
498
499 RETURN
500
5011000 FORMAT(/
502 . ' rigid body definitions '/
503 . ' ---------------------- '/)
5041100 FORMAT( /5X,'rigid body
id ',i10,1x,a
505 . /10x,'SENSOR ',i10
506 . /10x,'PRIMARY NODE ',i10
507 . /10x,'NUMBER OF NODES ',i10
508 . /10x,'SURFACE LINKED TO BODY ',i10
509 . /10x,'SPHERICAL INERTIA FLAG ',i10)
5101102 FORMAT( /5x,'RIGID BODY ID ',i10,1x,a
511 . /10x,'SENSOR ',i10
512 . /10x,'PRIMARY NODE ',i10
513 . /10x,'NUMBER OF NODES ',i10
514 . /10x,'SURFACE LINKED TO BODY ',i10
515 . /10x,'SPHERICAL INERTIA FLAG ',i10)
5161103 FORMAT( /10x,'NO AMS EXPANSION OVERALL THE RBODY ')
5171111 FORMAT( /5x,'RIGID BODY ID ',i10,1x,a
518 . /10x,'PRIMARY NODE ',i10
519 . /10x,'NUMBER OF NODES ',i10
520 . /10x,'SURFACE LINKED TO BODY ',i10
521 . /10x,'SKEW NUMBER ',i10
522 . /10x,'SPHERICAL INERTIA FLAG ',i10
523 . /10x,'REMOVE SECONDARY NODES FROM RIGID WALL(IF=0)',i10
524 . /10x,'CENTER OF MASS FLAG ',i10
525 . /10x,'ADDED MASS ',1pg20.4
526 . /10x,'ADDED INERTIA ',1p6g20.4)
5271112 FORMAT( /5x,'RIGID BODY ID ',i10,1x,a
528 . /10x,'PRIMARY NODE ',i10
529 . /10x,'NUMBER OF NODES ',i10
530 . /10x,'SURFACE LINKED TO BODY ',i10
531 . /10x,'SKEW NUMBER ',i10
532 . /10x,'SPHERICAL INERTIA FLAG ',i10
533 . /10x,'REMOVE SECONDARY NODES FROM RIGID WALL(IF=0)',i10
534 . /10x,'CENTER OF MASS FLAG ',i10
535 . /10x,'ADDED MASS ',1pg20.4
536 . /10x,'ADDED INERTIA ',1p6g20.4)
5371151 FORMAT(/10x,'FAILURE CRITERIA : ')
5381152 FORMAT(/10x,'NORMAL FORCE AT FAILURE. . . . . . . . . . . . .',1pg20.4
539 . /10x,'FAILURE EXPONENT PARAMETER IN NORMAL DIRECTION ',1pg20.4
540 . /10x,'SHEAR FORCE AT FAILURE . . . . . . . . . . . . .',1pg20.4
541 . /10x,'FAILURE EXPONENT PARAMETER IN SHEAR DIRECTION ',1pg20.4)
5421201 FORMAT(/10x,'SECONDARY NODES ')
5431202 FORMAT( 10x,10i10)
void anodset(int *id, int *type)
subroutine rigmodif_nd(nn, inn, itagnd, icnds10, iu, titr, itab)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
integer, parameter nchartitle
integer, parameter ncharkey
integer, dimension(:), allocatable tagrby
integer function ngr2usr(iu, igr, ngr)
subroutine hm_sz_r2r(tag, val, lsubmodel)
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)
subroutine spmdset(n, npby, nnpby, lpby, nsl, k)
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)
subroutine newdbl(list, ilist, nlist, tab, errid, status, nom_opt)
integer function usr2sys(iu, itabm1, mess, id)
subroutine udouble(list, ilist, nlist, mess, ir, rlist)