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,NCHSPHER,K,OFFS
87 INTEGER :: NPRW(*), LPRW(*), (*), ITABM1(*), IKINE(*), IMERGE(*),ITAGND(*),IKINE1(3*NUMNOD)
88 TYPE(SUBMODEL_DATA) :: (NSUBMOD)
89 my_real :: rwl(nrwlp,*), ms(*), v(3,*), x(3,*), rtrans(ntransf,*)
90 INTEGER NOM_OPT(LNOPT1,*)
91
92 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
93
94
95
96 INTEGER :: N, ITYP, ITIED, NSL, NUSER, MSR, J, I,L, IGU,IGU2, IGRS, NOSYS, IFQ, JC,UID,IFLAGUNIT,SUB_ID, SUB_INDEX
97 my_real :: dist, fric, diam, xmas, vx, vy, vz, x1, disn, x2, y2, z2, x3, freq,
alpha, fac_m_r2r
98 CHARACTER MESS*40
99 CHARACTER(LEN=NCHARTITLE) :: TITR
100 LOGICAL :: IS_AVAILABLE
101
102
103
104 INTEGER USR2SYS, NGR2USR
105 INTEGER, DIMENSION(:), POINTER :: INGR2USR
106 DATA mess/'STANDARD RIGID WALL DEFINITION '/
107
108
109
110! ********************************
111
112
113
114 is_available = .false.
116
117 ityp = 3
118
119
120
121
122 DO n = 1+offs, nchspher+offs
123
124
125
126
127 titr = ''
129 . option_id = nuser,
130 . unit_id = uid,
131 . submodel_index = sub_index,
132 . submodel_id = sub_id,
133 . option_titr = titr)
134
135 nom_opt(1,n)=nuser
136 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,n),ltitr)
137
138
139 iflagunit = 0
140 DO j=1,unitab%NUNITS
141 IF (unitab%UNIT_ID(j) == uid) THEN
142 iflagunit = 1
143 EXIT
144 ENDIF
145 ENDDO
146 IF (uid /= 0 .AND. iflagunit == 0) THEN
147 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,
148 . i2=uid,i1=nuser,c1='RIGID WALL',
149 . c2='RIGID WALL',
150 . c3=titr)
151 ENDIF
152
153
154 CALL hm_get_intv(
'Node1',nuser,is_available,lsubmodel)
155 CALL hm_get_intv(
'slidingflag',itied,is_available,lsubmodel)
156 CALL hm_get_intv(
'NodeSet_ID',igu,is_available,lsubmodel)
157 CALL hm_get_intv(
'excludeNodeSet_ID',igu2,is_available,lsubmodel)
158
159 IF(nuser /= 0) THEN
160 msr =
usr2sys(nuser,itabm1,mess,nuser)
163 IF (msr == imerge(
jc)) msr = imerge(numcnod+
jc)
164 ENDDO
165 ELSE
166 msr = 0
167 ENDIF
168
169
170
171 CALL hm_get_floatv(
'offset' ,dist ,is_available, lsubmodel, unitab)
172 CALL hm_get_floatv(
'fric' ,fric ,is_available, lsubmodel, unitab)
173 CALL hm_get_floatv(
'Diameter' ,diam ,is_available, lsubmodel, unitab)
174 CALL hm_get_floatv(
'Filteringfactor',freq ,is_available, lsubmodel, unitab)
175 CALL hm_get_intv(
'Filteringflag' ,ifq ,is_available, lsubmodel)
176 IF (freq == 0 .AND. ifq /= 0) ifq = 0
177 IF (ifq == 0) freq = one
179 IF (ifq >= 0) THEN
180 IF (ifq <= 1)
alpha = freq
181 IF (ifq == 2)
alpha = four*atan2(one,zero) / freq
182 IF (ifq == 3)
alpha = four*atan2(one,zero) * freq
183 ENDIF
184 IF ((
alpha < zero) .OR. ((
alpha > one .AND. ifq <= 2)))
THEN
185 CALL ancmsg(msgid=350,anmode=aninfo,msgtype=msgerror,
186 . i1=nuser,
187 . c1=titr,
188 . r1=freq)
189 ENDIF
190 rwl(13,n) = fric
192 rwl(15,n) = ifq
193
194
195
196 IF (msr == 0) THEN
197
201 IF(sub_id /= 0)
CALL subrotpoint(x1,x2,x3,rtrans,sub_id,lsubmodel)
202 rwl(4,n) = x1
203 rwl(5,n) = x2
204 rwl(6,n) = x3
205
206 ELSE IF (msr /= 0)THEN
207
208 CALL hm_get_floatv(
'Mass' ,xmas ,is_available, lsubmodel, unitab)
209 CALL hm_get_floatv(
'motionx' ,vx ,is_available, lsubmodel, unitab)
210 CALL hm_get_floatv(
'motiony' ,vy ,is_available, lsubmodel, unitab)
211 CALL hm_get_floatv(
'motionz' ,vz ,is_available, lsubmodel, unitab)
212
213 fac_m_r2r = one
214 IF (nsubdom > 0) THEN
215 IF(
tagno(npart+msr) == 4) fac_m_r2r = half
216 ENDIF
217 IF(sub_id /= 0)
CALL subrotvect(vx,vy,vz,rtrans,sub_id,lsubmodel)
218 rwl(4,n) = x(1,msr)
219 rwl(5,n) = x(2,msr)
220 rwl(6,n) = x(3,msr)
221 ms(msr) = ms(msr) + xmas*fac_m_r2r
222 v(1,msr) = vx
223 v(2,msr) = vy
224 v(3,msr) = vz
225 ENDIF
226
227
228 rwl(7,n) = diam
229
230
231 DO i = 1,numnod
232 lprw(k+i) = 0
233 ENDDO
234
235
236 IF (dist /= zero) THEN
237 DO i = 1,numnod
238 x2 = (x(1,i)-rwl(4,n))**2
239 y2 = (x(2,i)-rwl(5,n))**2
240 z2 = (x(3,i)-rwl(6,n))**2
241 disn = sqrt(x2+y2+z2)- half*diam
242 IF (disn >= zero .AND. disn <= dist .AND. i /= msr) lprw(k+i)=1
243 ENDDO
244 ENDIF
245
246
247 ingr2usr => igrnod(
248 igrs =
ngr2usr(igu,ingr2usr,ngrnod)
249 IF (igrs /= 0) THEN
250 DO j = 1,igrnod(igrs)%NENTITY
251 nosys = igrnod(igrs)%ENTITY(j)
252 lprw(k+nosys) = 1
253 IF (itab(nosys) == nuser) THEN
255 . msgtype=msgerror,
256 . anmode=aninfo_blind_1,
257 . i1=nuser,
258 . c1=titr,
259 . i2=nuser)
260 ENDIF
261 ENDDO
262 ENDIF
263
264
265 ingr2usr => igrnod(1:ngrnod)%ID
266 igrs =
ngr2usr(igu2,ingr2usr,ngrnod)
267 IF (igrs /= 0) THEN
268 DO j = 1,igrnod(igrs)%NENTITY
269 nosys = igrnod(igrs)%ENTITY(j)
270 lprw(k+nosys) = 0
271 ENDDO
272 ENDIF
273
274 ! compaction
275 nsl = 0
276 DO i = 1,numnod
277 IF (lprw(k+i) > 0) THEN
278 IF (ns10e > 0) THEN
279 IF( itagnd(i) /= 0) cycle
280 ENDIF
281 nsl = nsl+1
282 lprw(k+nsl) = i
283 IF (iddlevel == 0) THEN
284 CALL kinset(4,itab(i),ikine(i),1,n+numskw+1,ikine1(i))
285 ENDIF
286 ENDIF
287 ENDDO
288
289 IF (ns10e > 0 )
CALL remove_nd(nsl,lprw(k+1),itagnd)
290 ifi=ifi+nsl
291 IF (ifq > 0) THEN
292 mfi=mfi+3*nsl
293 srwsav = srwsav + 3 * nsl
294 ENDIF
295
296
297 IF (msr == 0) THEN
298 WRITE(iout,1100) n,ityp,itied,nsl
299 ELSE
300 WRITE(iout,1150) n,ityp,itied,nsl,nuser,xmas,vx,vy,vz
301 ENDIF
302
303 WRITE(iout,2003)(rwl(l,n),l=4,6),rwl(7,n)
304
305 IF (itied == 2) WRITE(iout,2101)fric,ifq,freq
306 IF (ipri >= 1) THEN
307 WRITE(iout,1200)
308 WRITE(iout,1201) (itab(lprw(i+k)),i=1,nsl)
309 ENDIF
310
311 nprw(n) = nsl
312 nprw(n+nrwall) = itied
313 nprw(n+2*nrwall) = msr
314 nprw(n+3*nrwall) = ityp
315 nprw(n+4*nrwall) = 0
316 nprw(n+5*nrwall) = 0
317 k = k+nsl
318
319 ENDDO
320
321
322 offs = offs + nchspher
323
324 RETURN
325
326 1100 FORMAT(/5x,'RIGID WALL NUMBER. . . . .',i10
327 . /10x,'RIGID WALL TYPE . . . . .',i10
328 . /10x,'TYPE SLIDE/TIED/FRICTION.',i10
329 . /10x,'NUMBER OF NODES . . . . .',i10)
330 1150 FORMAT(/5x,'RIGID WALL NUMBER. . . . .',i10
331 . /10x,'RIGID WALL TYPE . . . . .',i10
332 . /10x,'TYPE SLIDE/TIED/FRICTION.',i10
333 . /10x,'NUMBER OF NODES . . . . .',i10
334 . /10x,'WALL NODE NUMBER. . . . .',i10
335 . /10x,'WALL MASS . . . . . . . .',1pg14.4
336 . /10x,'WALL X-VELOCITY . . . . .',1pg14.4
337 . /10x,'WALL Y-VELOCITY . . . . .',1pg14.4
338 . /10x,'WALL Z-VELOCITY . . . . .',1pg14.4)
339 1200 FORMAT(/10x,'SECONDARY NODES : ')
340 1201 FORMAT(/10x,10i10)
341 2003 FORMAT(/5x,'SPHERICAL WALL CHARACTERISTICS',
342 . /10x,'POINT M . . . . . . . . .',1p3g20.13
343 . /10x,'SPHERE DIAMETER . . . . .',1pg14.4)
344 2101 FORMAT(/5x,'COULOMB FRICTION CHARACTERISTICS',
345 . /10x,'FRICTION COEFFICIENT . . .',1pg14.4
346 . /10x,'FILTRATION FLAG. . . . . .',i10
347 . /10x,'FILTRATION FACTOR. . . . .',1pg14.4)
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 jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)
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)