52
53
54
55
56
64
65
66
67#include "implicit_f.inc"
68
69
70
71#include "analyse_name.inc"
72
73
74
75#include "com04_c.inc"
76#include "units_c.inc"
77#include "scr03_c.inc"
78#include "scr17_c.inc"
79#include "param_c.inc"
80#include "tabsiz_c.inc"
81#include "r2r_c.inc"
82
83
84
85 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
86 INTEGER IFI,MFI,IDDLEVEL,NCHCYL,K,OFFS
87 INTEGER NPRW(*), LPRW(*), ITAB(*), ITABM1(*),
88 . IKINE(*), IMERGE(*),ITAGND(*),IKINE1(3*NUMNOD)
89 TYPE(SUBMODEL_DATA) LSUBMODEL(*)
91 . rwl(nrwlp,*), ms(*), v(3,*), x(3,*),
92 . rtrans(ntransf,*)
93 INTEGER NOM_OPT(LNOPT1,*)
94
95 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
96
97
98
99 INTEGER N, ITYP, ITIED, NSL, NUSER, MSR, J, I,L, ,IGU2, IGRS, NOSYS, IFQ, JC,UID,IFLAGUNIT,SUB_ID, SUB_INDEX
100 my_real :: dist, fric, diam, xmas, vx, vy, vz, xm1, ym1, zm1, d1, d2
101 my_real :: xn, x1, y1, z1, disn, x2, y2, z2, x3, freq,
alpha, fac_m_r2r
102 CHARACTER MESS*40
103 CHARACTER(LEN=NCHARTITLE)::TITR
104 LOGICAL :: IS_AVAILABLE
105
106
107
108 INTEGER USR2SYS, NGR2USR
109 INTEGER, DIMENSION(:), POINTER :: INGR2USR
110 DATA mess/'STANDARD RIGID WALL DEFINITION '/
111
112
113
114
115
116
117
118 is_available = .false.
120
121 ityp = 2
122
123
124
125 DO n = 1+offs, nchcyl+offs
126
127
128
129
130 titr = ''
132 . option_id = nuser,
133 . unit_id = uid,
134 . submodel_index = sub_index,
135 . submodel_id = sub_id,
136 . option_titr = titr)
137
138 nom_opt(1,n)=nuser
139 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
140
141
142 iflagunit = 0
143 DO j=1,unitab%NUNITS
144 IF (unitab%UNIT_ID(j) == uid) THEN
145 iflagunit = 1
146 EXIT
147 ENDIF
148 ENDDO
149 IF (uid /= 0 .AND. iflagunit == 0) THEN
150 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
151 . i2=uid,i1=nuser,c1='RIGID WALL',
152 . c2='RIGID WALL',
153 . c3=titr)
154 ENDIF
155
156
157 CALL hm_get_intv(
'Node1',nuser,is_available,lsubmodel)
158 CALL hm_get_intv('slidingflag
',ITIED,IS_AVAILABLE,LSUBMODEL)
159 CALL HM_GET_INTV('nodeset_id',IGU,IS_AVAILABLE,LSUBMODEL)
160 CALL HM_GET_INTV('excludenodeset_id',IGU2,IS_AVAILABLE,LSUBMODEL)
161
162 IF(NUSER /= 0) THEN
163 MSR = USR2SYS(NUSER,ITABM1,MESS,NUSER)
164 CALL ANODSET(MSR, CHECK_USED)
165 DO JC = 1,NMERGED
166 IF (MSR == IMERGE(JC)) MSR = IMERGE(NUMCNOD+JC)
167 ENDDO
168 ELSE
169 MSR = 0
170 ENDIF
171
172 ! 2nd card
173 ! d fric Diameter ffac ifq
174 CALL HM_GET_FLOATV('offset' ,DIST ,IS_AVAILABLE, LSUBMODEL, UNITAB)
175 CALL HM_GET_FLOATV('fric' ,FRIC ,IS_AVAILABLE, LSUBMODEL, UNITAB)
176 CALL HM_GET_FLOATV('diameter' ,DIAM ,IS_AVAILABLE, LSUBMODEL, UNITAB)
177 CALL HM_GET_FLOATV('filteringfactor',FREQ ,IS_AVAILABLE, LSUBMODEL, UNITAB)
178 CALL HM_GET_INTV('filteringflag' ,IFQ ,IS_AVAILABLE, LSUBMODEL)
179 ALPHA = ZERO
180.AND. IF (FREQ == 0 IFQ /= 0) IFQ = 0
181 IF (IFQ == 0) FREQ = ONE
182 IF (IFQ >= 0) THEN
183 IF (IFQ <= 1) ALPHA = FREQ
184 IF (IFQ == 2) ALPHA = FOUR*ATAN2(ONE,ZERO) / FREQ
185 IF (IFQ == 3) ALPHA = FOUR*ATAN2(ONE,ZERO) * FREQ
186 ENDIF
187.OR..AND. IF ((ALPHA < ZERO) ((ALPHA > ONE IFQ <= 2))) THEN
188 CALL ANCMSG(MSGID=350,ANMODE=ANINFO,MSGTYPE=MSGERROR,
189 . I1=NUSER,
190 . C1=TITR,
191 . R1=FREQ)
192 ENDIF
193 RWL(13,N) = FRIC
194 RWL(14,N) = ALPHA
195 RWL(15,N) = IFQ
196
197 ! 3rd card
198 ! if node_ID == 0
199 IF (MSR == 0) THEN
200 ! XM YM ZM
201 CALL HM_GET_FLOATV('x' ,X1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
202 CALL HM_GET_FLOATV('y' ,X2 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
203 CALL HM_GET_FLOATV('z' ,X3 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
204 IF(SUB_ID /= 0) CALL SUBROTPOINT(X1,X2,X3,RTRANS,SUB_ID,LSUBMODEL)
205 RWL(4,N) = X1
206 RWL(5,N) = X2
207 RWL(6,N) = X3
208 ! if node_ID > 0
209 ELSE IF (MSR /= 0)THEN
210 ! Mass VX0 VY0 VZ0
211 CALL HM_GET_FLOATV('mass' ,XMAS ,IS_AVAILABLE, LSUBMODEL, UNITAB)
212 CALL HM_GET_FLOATV('motionx' ,VX ,IS_AVAILABLE, LSUBMODEL, UNITAB)
213 CALL HM_GET_FLOATV('motiony' ,VY ,IS_AVAILABLE, LSUBMODEL, UNITAB)
214 CALL HM_GET_FLOATV('motionz' ,VZ ,IS_AVAILABLE, LSUBMODEL, UNITAB)
215 ! Multidomains : masse of the rwall splitted between 2 domains
216 FAC_M_R2R = ONE
217 IF (NSUBDOM > 0) THEN
218 IF(TAGNO(NPART+MSR) == 4) FAC_M_R2R = HALF
219 ENDIF
220 IF(SUB_ID /= 0) CALL SUBROTVECT(VX,VY,VZ,RTRANS,SUB_ID,LSUBMODEL)
221 RWL(4,N) = X(1,MSR)
222 RWL(5,N) = X(2,MSR)
223 RWL(6,N) = X(3,MSR)
224 MS(MSR) = MS(MSR) + XMAS*FAC_M_R2R
225 V(1,MSR) = VX
226 V(2,MSR) = VY
227 V(3,MSR) = VZ
228 ENDIF
229
230 ! 4th card (only for PLANE, CYL and PARAL)
231 ! XM1 YM1 ZM1
232 CALL HM_GET_FLOATV('xh' ,XM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
233 CALL HM_GET_FLOATV('yh' ,YM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
234 CALL HM_GET_FLOATV('zh' ,ZM1 ,IS_AVAILABLE, LSUBMODEL, UNITAB)
235 IF (SUB_ID /= 0) CALL SUBROTPOINT(XM1,YM1,ZM1,RTRANS,SUB_ID,LSUBMODEL)
236
237 ! Initialization depending on the type of interface
238 ! CYL
239
240 RWL(1,N) = XM1-RWL(4,N)
241 RWL(2,N) = YM1-RWL(5,N)
242 RWL(3,N) = ZM1-RWL(6,N)
243 XN = SQRT(RWL(1,N)**2+RWL(2,N)**2+RWL(3,N)**2)
244 IF (XN <= EM10) THEN
245 CALL ANCMSG(MSGID=167,ANMODE=ANINFO,MSGTYPE=MSGERROR,
246 . I1=NUSER,C2='cyl',C1=TITR)
247 ELSE
248 RWL(1,N) = RWL(1,N)/XN
249 RWL(2,N) = RWL(2,N)/XN
250 RWL(3,N) = RWL(3,N)/XN
251 RWL(7,N) = DIAM
252 ENDIF
253
254 ! Looking for SECONDARY nodes
255 DO I = 1,NUMNOD
256 LPRW(K+I) = 0
257 ENDDO
258
259 ! SECONDARY nodes at DIST from the RWALL
260 IF (DIST /= ZERO) THEN
261 DO I = 1,NUMNOD
262 X1 = (X(1,I)-RWL(4,N))*RWL(1,N)
263 Y1 = (X(2,I)-RWL(5,N))*RWL(2,N)
264 Z1 = (X(3,I)-RWL(6,N))*RWL(3,N)
265 D1 = (X1+Y1+Z1)
266 X2 = (X(1,I)-RWL(4,N))**2
267 Y2 = (X(2,I)-RWL(5,N))**2
268 Z2 = (X(3,I)-RWL(6,N))**2
269 D2 = (X2+Y2+Z2)
270 DISN = SQRT(D2-D1**2) - HALF*DIAM
271.AND..AND. IF (DISN >= ZERO DISN <= DIST I /= MSR) LPRW(K+I)=1
272 ENDDO
273 ENDIF
274
275 ! Node group +
276 INGR2USR => IGRNOD(1:NGRNOD)%ID
277 IGRS = NGR2USR(IGU,INGR2USR,NGRNOD)
278 IF (IGRS /= 0) THEN
279 DO J = 1,IGRNOD(IGRS)%NENTITY
280 NOSYS = IGRNOD(IGRS)%ENTITY(J)
281 LPRW(K+NOSYS) = 1
282 IF (ITAB(NOSYS) == NUSER) THEN
283 CALL ANCMSG(MSGID=637,
284 . MSGTYPE=MSGERROR,
285 . ANMODE=ANINFO_BLIND_1,
286 . I1=NUSER,
287 . C1=TITR,
288 . I2=NUSER)
289 ENDIF
290 ENDDO
291 ENDIF
292
293 ! Node group -
294 INGR2USR => IGRNOD(1:NGRNOD)%ID
295 IGRS = NGR2USR(IGU2,INGR2USR,NGRNOD)
296 IF (IGRS /= 0) THEN
297 DO J = 1,IGRNOD(IGRS)%NENTITY
298 NOSYS = IGRNOD(IGRS)%ENTITY(J)
299 LPRW(K+NOSYS) = 0
300 ENDDO
301 ENDIF
302
303 ! Compaction
304 NSL = 0
305 DO I = 1,NUMNOD
306 IF (LPRW(K+I) > 0) THEN
307 IF (NS10E > 0) THEN
308 IF( ITAGND(I) /= 0) CYCLE
309 ENDIF
310 NSL = NSL+1
311 LPRW(K+NSL) = I
312 IF (IDDLEVEL == 0) THEN
313 CALL KINSET(4,ITAB(I),IKINE(I),1,N+NUMSKW+1,IKINE1(I))
314 ENDIF
315 ENDIF
316 ENDDO
317 ! Itet=2 of S10
318 IF (NS10E > 0 ) CALL REMOVE_ND(NSL,LPRW(K+1),ITAGND)
319 IFI=IFI+NSL
320 IF (IFQ > 0) THEN
321 MFI=MFI+3*NSL
322 SRWSAV = SRWSAV + 3 * NSL
323 ENDIF
324
325 ! Printing
326 IF (MSR == 0) THEN
327 WRITE(IOUT,1100) N,ITYP,ITIED,NSL
328 ELSE
329 WRITE(IOUT,1150) N,ITYP,ITIED,NSL,NUSER,XMAS,VX,VY,VZ
330 ENDIF
331
332 WRITE(IOUT,2002)(RWL(L,N),L=4,6),RWL(7,N),(RWL(L,N),L=1,3)
333
334 IF (ITIED == 2) WRITE(IOUT,2101) FRIC,IFQ,FREQ
335 IF (IPRI >= 1) THEN
336 WRITE(IOUT,1200)
337 WRITE(IOUT,1201) (ITAB(LPRW(I+K)),I=1,NSL)
338 ENDIF
339
340 NPRW(N) = NSL
341 NPRW(N+NRWALL) = ITIED
342 NPRW(N+2*NRWALL) = MSR
343 NPRW(N+3*NRWALL) = ITYP
344 NPRW(N+4*NRWALL) = 0
345 NPRW(N+5*NRWALL) = 0
346 K = K+NSL
347
348 ENDDO
349
350 ! Updating the OFFSET
351 OFFS = OFFS + NCHCYL
352
353 RETURN
354
355 1100 FORMAT(/5X,'rigid wall number. . . . .',I10
356 . /10X,'rigid wall TYPE . . . . .',I10
357 . /10X,'type slide/tied/friction.',I10
358 . /10X,'number of nodes . . . . .',I10)
359 1150 FORMAT(/5X,'rigid wall number. . . . .',I10
360 . /10X,'rigid wall TYPE . . . . .',I10
361 . /10X,'type slide/tied/friction.',I10
362 . /10X,'number of nodes . . . . .',i10
363 . /10x,'WALL NODE NUMBER. . . . .',i10
364 . /10x,'WALL MASS . . . . . . . .',1pg14.4
365 . /10x,'WALL X-VELOCITY . . . . .',1pg14.4
366 . /10x,'WALL Y-VELOCITY . . . . .',1pg14.4
367 . /10x,'WALL Z-VELOCITY . . . . .',1pg14.4)
368 1200 FORMAT(/10x,'SECONDARY NODES : ')
369 1201 FORMAT(/10x,10i10)
370 2002 FORMAT(/5x,'CYLINDRIC WALL CHARACTERISTICS',
371 . /10x,'POINT M . . . . . . . . .',1p3g20.13
372 . /10x,'CYLINDER DIAMETER . . . .',1pg14.4
373 . /10x,'AXIS VECTOR . . . . . . .',1p3g20.13)
374 2101 FORMAT(/5x,'COULOMB FRICTION CHARACTERISTICS',
375 . /10x,'FRICTION COEFFICIENT . . .',1pg14.4
376 . /10x,'FILTRATION FLAG. . . . . .',i10
377 . /10x,'FILTRATION FACTOR. . . . .',1pg14.4)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
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)