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(*), (*),
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, IGU,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 INTEGER :: IPEN
106
107
108
109 INTEGER USR2SYS, NGR2USR
110 INTEGER, DIMENSION(:), POINTER :: INGR2USR
111 DATA mess/'STANDARD RIGID WALL DEFINITION '/
112
113
114
115
116
117
118
119 is_available = .false.
121
122 ityp = 2
123
124
125
126 DO n = 1+offs, nchcyl+offs
127
128
129
130
131 titr = ''
133 . option_id = nuser,
134 . unit_id = uid,
135 . submodel_index = sub_index,
136 . submodel_id = sub_id,
137 . option_titr = titr)
138
139 nom_opt(1,n)=nuser
140 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
141
142
143 iflagunit = 0
144 DO j=1,unitab%NUNITS
145 IF (unitab%UNIT_ID(j) == uid) THEN
146 iflagunit = 1
147 EXIT
148 ENDIF
149 ENDDO
150 IF (uid /= 0 .AND. iflagunit == 0) THEN
151 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror
152 . i2=uid,i1=nuser,c1='RIGID WALL',
153 . c2='RIGID WALL',
154 . c3=titr)
155 ENDIF
156
157
158 CALL hm_get_intv(
'Node1',nuser,is_available,lsubmodel)
159 CALL hm_get_intv(
'slidingflag',itied,is_available,lsubmodel)
160 CALL hm_get_intv(
'NodeSet_ID',igu,is_available,lsubmodel)
161 CALL hm_get_intv(
'excludeNodeSet_ID',igu2,is_available,lsubmodel)
162 CALL hm_get_intv(
'Iform',ipen,is_available,lsubmodel)
163
164 IF(nuser /= 0) THEN
165 msr =
usr2sys(nuser,itabm1,mess,nuser)
167 DO jc = 1,nmerged
168 IF (msr == imerge(jc)) msr = imerge(numcnod+jc)
169 ENDDO
170 ELSE
171 msr = 0
172 ENDIF
173
174
175
176 CALL hm_get_floatv(
'offset' ,dist ,is_available, lsubmodel, unitab)
177 CALL hm_get_floatv(
'fric' ,fric ,is_available, lsubmodel, unitab)
178 CALL hm_get_floatv(
'Diameter' ,diam ,is_available, lsubmodel, unitab)
179 CALL hm_get_floatv(
'Filteringfactor',freq ,is_available, lsubmodel, unitab)
180 CALL hm_get_intv(
'Filteringflag' ,ifq ,is_available, lsubmodel)
182 IF (freq == 0 .AND. ifq /= 0) ifq = 0
183 IF (ifq == 0) freq = one
184 IF (ifq >= 0) THEN
185 IF (ifq <= 1)
alpha = freq
186 IF (ifq == 2)
alpha = four*atan2(one,zero) / freq
187 IF (ifq == 3)
alpha = four*atan2(one,zero) * freq
188 ENDIF
189 IF ((
alpha < zero) .OR. ((
alpha > one .AND. ifq <= 2)))
THEN
190 CALL ancmsg(msgid=350,anmode=aninfo,msgtype=msgerror,
191 . i1=nuser,
192 . c1=titr,
193 . r1=freq)
194 ENDIF
195 rwl(13,n) = fric
197 rwl(15,n) = ifq
198
199
200
201 IF (msr == 0) THEN
202
206 IF(sub_id /= 0)
CALL subrotpoint(x1,x2,x3,rtrans,sub_id,lsubmodel)
207 rwl(4,n) = x1
208 rwl(5,n) = x2
209 rwl(6,n) = x3
210
211 ELSE IF (msr /= 0)THEN
212
213 CALL hm_get_floatv(
'Mass' ,xmas ,is_available, lsubmodel, unitab)
214 CALL hm_get_floatv(
'motionx' ,vx ,is_available, lsubmodel, unitab)
215 CALL hm_get_floatv(
'motiony' ,vy ,is_available, lsubmodel, unitab)
216 CALL hm_get_floatv(
'motionz' ,vz ,is_available, lsubmodel, unitab)
217
218 fac_m_r2r = one
219 IF (nsubdom > 0) THEN
220 IF(
tagno(npart+msr) == 4) fac_m_r2r = half
221 ENDIF
222 IF(sub_id /= 0)
CALL subrotvect(vx,vy,vz,rtrans,sub_id,lsubmodel)
223 rwl(4,n) = x(1,msr)
224 rwl(5,n) = x(2,msr)
225 rwl(6,n) = x(3,msr)
226 ms(msr) = ms(msr) + xmas*fac_m_r2r
227 v(1,msr) = vx
228 v(2,msr) = vy
229 v(3,msr) = vz
230 ENDIF
231
232
233
234 CALL hm_get_floatv(
'XH' ,xm1 ,is_available, lsubmodel, unitab)
237 IF (sub_id /= 0)
CALL subrotpoint(xm1,ym1,zm1,rtrans
238
239
240
241
242 rwl(1,n) = xm1-rwl(4,n)
243 rwl(2,n) = ym1-rwl(5,n)
244 rwl(3,n) = zm1-rwl(6,n)
245 xn = sqrt(rwl(1,n)**2+rwl(2,n)**2+rwl(3,n)**2)
246 IF (xn <= em10) THEN
247 CALL ancmsg(msgid=167,anmode=aninfo,msgtype=msgerror,
248 . i1=nuser,c2='CYL',c1=titr)
249 ELSE
250 rwl(1,n) = rwl(1,n)/xn
251 rwl(2,n) = rwl(2,n)/xn
252 rwl(3,n) = rwl(3,n)/xn
253 rwl(7,n) = diam
254 ENDIF
255
256
257 DO i = 1,numnod
258 lprw(k+i) = 0
259 ENDDO
260
261
262 IF (dist /= zero) THEN
263 DO i = 1,numnod
264 x1 = (x(1,i)-rwl(4,n))*rwl(1,n)
265 y1 = (x(2,i)-rwl(5,n))*rwl(2,n)
266 z1 = (x(3,i)-rwl(6,n))*rwl(3,n)
267 d1 = (x1+y1+z1)
268 x2 = (x(1,i)-rwl(4,n))**2
269 y2 = (x(2,i)-rwl(5,n))**2
270 z2 = (x(3,i)-rwl(6,n))**2
271 d2 = (x2+y2+z2)
272 disn = sqrt(d2-d1**2) - half*diam
273 IF (disn >= zero .AND. disn <= dist .AND. i /= msr) lprw(k+i)=1
274 ENDDO
275 ENDIF
276
277
278 ingr2usr => igrnod(1:ngrnod)%ID
279 igrs =
ngr2usr(igu,ingr2usr,ngrnod)
280 IF (igrs /= 0) THEN
281 DO j = 1,igrnod(igrs)%NENTITY
282 nosys = igrnod(igrs)%ENTITY(j)
283 lprw(k+nosys) = 1
284 IF (itab(nosys) == nuser) THEN
286 . msgtype=msgerror,
287 . anmode=aninfo_blind_1,
288 . i1=nuser,
289 . c1=titr,
290 . i2=nuser)
291 ENDIF
292 ENDDO
293 ENDIF
294
295
296 ingr2usr => igrnod(1:ngrnod)%ID
297 igrs =
ngr2usr(igu2,ingr2usr,ngrnod)
298 IF (igrs /= 0) THEN
299 DO j = 1,igrnod(igrs)%NENTITY
300 nosys = igrnod(igrs)%ENTITY(j)
301 lprw(k+nosys) = 0
302 ENDDO
303 ENDIF
304
305
306 nsl = 0
307 DO i = 1,numnod
308 IF (lprw(k+i) > 0) THEN
309 IF (ns10e > 0.AND.ipen==0) THEN
310 IF( itagnd(i) /= 0) cycle
311 ENDIF
312 nsl = nsl+1
313 lprw(k+nsl) = i
314 IF (iddlevel == 0.AND.ipen==0) THEN
315 CALL kinset(4,itab(i),ikine(i),1,n+numskw+1,ikine1(i))
316 ENDIF
317 ENDIF
318 ENDDO
319
320 IF (ns10e > 0 .AND.ipen==0)
CALL remove_nd(nsl
321 ifi=ifi+nsl
322 IF (ifq > 0) THEN
323 mfi=mfi+3*nsl
324 srwsav = srwsav + 3 * nsl
325 ENDIF
326
327
328 IF (msr == 0) THEN
329 WRITE(iout,1100) n,ityp,itied,nsl
330 ELSE
331 WRITE(iout,1150) n,ityp,itied,nsl,nuser,xmas
332 ENDIF
333 IF (ipen > 0) WRITE(iout,2500)
334
335 WRITE(iout,2002)(rwl(l,n),l=4,6),rwl(7,n),(rwl(l,n),l=1,3)
336
337 IF (itied == 2) WRITE(iout,2101) fric,ifq,freq
338 IF (ipri >= 1) THEN
339 WRITE(iout,1200)
340 WRITE(iout,1201) (itab(lprw(i+k)),i=1,nsl)
341 ENDIF
342
343 nprw(n) = nsl
344 nprw(n+nrwall) = itied
345 nprw(n+2*nrwall) = msr
346 nprw(n+3*nrwall) = ityp
347 nprw(n+4*nrwall) = 0
348 nprw(n+5*nrwall) = 0
349 nprw(n+8*nrwall) = ipen
350 k = k+nsl
351
352 ENDDO
353
354
355 offs = offs + nchcyl
356
357 RETURN
358
359 1100 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 1150 FORMAT(/5x,'RIGID WALL NUMBER. . . . .',i10
364 . /10x,'RIGID WALL TYPE . . . . .',i10
365 . /10x,'TYPE SLIDE/TIED/FRICTION.',i10
366 . /10x,'NUMBER OF NODES . . . . .',i10
367 . /10x,'WALL NODE NUMBER. . . . .',i10
368 . /10x,'WALL MASS . . . . . . . .',1pg14.4
369 . /10x,'WALL X-VELOCITY . . . . .',1pg14.4
370 . /10x,'WALL Y-VELOCITY . . . . .',1pg14.4
371 . /10x,'WALL Z-VELOCITY . . . . .',1pg14.4)
372 1200 FORMAT(/10x,'SECONDARY NODES : ')
373 1201 FORMAT(/10x,10i10)
374 2002 FORMAT(/5x,'CYLINDRIC WALL CHARACTERISTICS',
375 . /10x,'POINT M . . . . . . . . .',1p3g20.13
376 . /10x,'CYLINDER DIAMETER . . . .',1pg14.4
377 . /10x,'AXIS VECTOR . . . . . . .',1p3g20.13)
378 2101 FORMAT(/5x,'COULOMB FRICTION CHARACTERISTICS',
379 . /10x,'FRICTION COEFFICIENT . . .',1pg14.4
380 . /10x,'FILTRATION FLAG. . . . . .',i10
381 . /10x,'FILTRATION FACTOR. . . . .',1pg14.4)
382 2500 FORMAT(/5x,'RIGID WALL FORMULATION : PENALTY'/)
void anodset(int *id, int *type)
subroutine remove_nd(nn, inn, itagnd)
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)
subroutine kinset(ik, node, ikine, idir, isk, ikine1)
integer, parameter nchartitle
integer, parameter ncharkey
integer, dimension(:), allocatable tagno
integer function ngr2usr(iu, igr, ngr)
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)
subroutine subrotvect(x, y, z, rtrans, sub_id, lsubmodel)
subroutine subrotpoint(x, y, z, rtrans, sub_id, lsubmodel)