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 "lagmult.inc"
76#include "com04_c.inc"
77#include "units_c.inc"
78#include "scr03_c.inc"
79#include "scr17_c.inc"
80#include "param_c.inc"
81#include "tabsiz_c.inc"
82#include "r2r_c.inc"
83
84
85
86 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
87 INTEGER IFI,MFI,IDDLEVEL,NCHLAGM,K,OFFS
88 INTEGER NPRW(*), LPRW(*), ITAB(*), ITABM1(*),
89 . IKINE(*), IMERGE(*),ITAGND(*),IKINE1LAG(*)
90 TYPE(SUBMODEL_DATA) LSUBMODEL(*)
92 . rwl(nrwlp,*), ms(*), v(3,*), x(3,*),
93 . rtrans(ntransf,*)
94 INTEGER NOM_OPT(LNOPT1,*)
95
96 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
97
98
99
100 INTEGER N, ITYP, ITIED, NSL, , MSR, J, I,L, IGU,IGU2, IGRS, NOSYS, IFQ, JC, UID,IFLAGUNIT,SUB_ID, SUB_INDEX
101 my_real :: dist, fric, diam, xmas, vx, vy, vz, xm1, ym1, zm1
102 my_real :: xn, x1, y1, z1, disn, x2, x3, freq,
alpha, fac_m_r2r
103 CHARACTER MESS*40
104 CHARACTER(LEN=NCHARTITLE) :: TITR
105 LOGICAL :: IS_AVAILABLE
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 is_available = .false.
120
121 ityp = 1
122
123
124
125 DO n = 1+offs, nchlagm+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)
166 IF (msr == imerge(
jc)) msr = imerge(numcnod+
jc)
167 ENDDO
168 ELSE
169 msr = 0
170 ENDIF
171
172
173
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 IF (freq == 0 .AND. ifq /= 0) ifq = 0
180 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 IF ((
alpha < zero) .OR. ((
alpha > one .AND. 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
195 rwl(15,n) = ifq
196
197
198
199 IF (msr == 0) THEN
200
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
209 ELSE IF (msr /= 0)THEN
210
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 ! PLANE
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='plane',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 ENDIF
252
253 ! Looking for SECONDARY nodes
254 DO I = 1,NUMNOD
255 LPRW(K+I) = 0
256 ENDDO
257
258 ! SECONDARY nodes at DIST from the RWALL
259 IF (DIST /= ZERO) THEN
260 DO I = 1,NUMNOD
261 X1 = (X(1,I)-RWL(4,N))*RWL(1,N)
262 Y1 = (X(2,I)-RWL(5,N))*RWL(2,N)
263 Z1 = (X(3,I)-RWL(6,N))*RWL(3,N)
264 DISN = X1+Y1+Z1
265.AND..AND. IF (DISN >= ZERO DISN <= DIST I /= MSR) LPRW(K+I)=1
266 ENDDO
267 ENDIF
268
269 ! Node group +
270 INGR2USR => IGRNOD(1:NGRNOD)%ID
271 IGRS = NGR2USR(IGU,INGR2USR,NGRNOD)
272 IF (IGRS /= 0) THEN
273 DO J = 1,IGRNOD(IGRS)%NENTITY
274 NOSYS = IGRNOD(IGRS)%ENTITY(J)
275 LPRW(K+NOSYS) = 1
276 IF (ITAB(NOSYS) == NUSER) THEN
277 CALL ANCMSG(MSGID=637,
278 . MSGTYPE=MSGERROR,
279 . ANMODE=ANINFO_BLIND_1,
280 . I1=NUSER,
281 . C1=TITR,
282 . I2=NUSER)
283 ENDIF
284 ENDDO
285 ENDIF
286
287 ! Node group -
288 INGR2USR => IGRNOD(1:NGRNOD)%ID
289 IGRS = NGR2USR(IGU2,INGR2USR,NGRNOD)
290 IF (IGRS /= 0) THEN
291 DO J = 1,IGRNOD(IGRS)%NENTITY
292 NOSYS = IGRNOD(IGRS)%ENTITY(J)
293 LPRW(K+NOSYS) = 0
294 ENDDO
295 ENDIF
296
297 ! Compaction
298 NSL = 0
299 DO I = 1,NUMNOD
300 IF (LPRW(K+I) > 0) THEN
301 IF (NS10E > 0) THEN
302 IF(ITAGND(I) /= 0) CYCLE
303 ENDIF
304 NSL = NSL+1
305 LPRW(K+NSL) = I
306 IF (IDDLEVEL == 0) THEN
307 CALL KINSET(512,ITAB(I),IKINE(I),7,0,IKINE1LAG(I))
308 ENDIF
309 ENDIF
310 ENDDO
311 ! Itet=2 of S10
312 IF (NS10E > 0 ) CALL REMOVE_ND(NSL,LPRW(K+1),ITAGND)
313 IFI=IFI+NSL
314 IF (IFQ > 0) THEN
315 MFI=MFI+3*NSL
316 SRWSAV = SRWSAV + 3 * NSL
317 ENDIF
318
319 ! Printing
320 IF (MSR == 0) THEN
321 WRITE(IOUT,1100) N,ITYP,ITIED,NSL
322 ELSE
323 WRITE(IOUT,1150) N,ITYP,ITIED,NSL,NUSER,XMAS,VX,VY,VZ
324 ENDIF
325
326 WRITE(IOUT,1160)
327 WRITE(IOUT,2001)(RWL(L,N),L=4,6),(RWL(L,N),L=1,3)
328
329 IF (ITIED == 2) WRITE(IOUT,2101)FRIC,IFQ,FREQ
330 IF (IPRI >= 1) THEN
331 WRITE(IOUT,1200)
332 WRITE(IOUT,1201) (ITAB(LPRW(I+K)),I=1,NSL)
333 ENDIF
334
335 NPRW(N) = NSL
336 NPRW(N+NRWALL) = ITIED
337 NPRW(N+2*NRWALL) = MSR
338 NPRW(N+3*NRWALL) = ITYP
339 NPRW(N+4*NRWALL) = 0
340 NPRW(N+5*NRWALL) = 1
341 NRWLAG = MAX(NRWLAG,NSL)
342 IF (ITIED == 0) THEN
343 LAG_NCL=LAG_NCL+NSL
344 LAG_NKL=LAG_NKL+NSL*3
345 ELSE IF (ITIED == 1) THEN
346 LAG_NCL=LAG_NCL+NSL*3
347 LAG_NKL=LAG_NKL+NSL*3
348 ENDIF
349 IF (MSR /= 0) THEN
350 LAG_NKL=LAG_NKL+NSL*3
351 ENDIF
352 K = K+NSL
353
354 ENDDO
355
356 ! Updating the OFFSET
357 OFFS = OFFS + NCHLAGM
358
359 RETURN
360
361 1100 FORMAT(/5X,'rigid wall number. . . . .',I10
362 . /10X,'rigid wall TYPE . . . . .',I10
363 . /10X,'type slide/tied/friction.',I10
364 . /10X,'number of nodes . . . . .',I10)
365 1150 FORMAT(/5X,'rigid wall number. . . . .',I10
366 . /10X,'rigid wall TYPE . . . . .',I10
367 . /10X,'type slide/tied/friction.',I10
368 . /10X,'number of nodes . . . . .',I10
369 . /10X,'wall node number. . . . .',I10
370 . /10X,'wall mass . . . . . . . .',1PG14.4
371 . /10X,'wall x-velocity . . . . .',1PG14.4
372 . /10X,'wall y-velocity . . . . .',1PG14.4
373 . /10X,'wall z-velocity . . . . .',1PG14.4)
374 1160 FORMAT(10X,'lagrange multiplier option')
375 1200 FORMAT(/10X,'secondary nodes : ')
376 1201 FORMAT(/10X,10I10)
377 2001 FORMAT(/5X,'infinite wall characteristics',
378 . /10X,'point m . . . . . . . . .',1P3G20.13
379 . /10X,'normal vector . . . . . .',1P3G20.13)
380 2101 FORMAT(/5X,'coulomb friction characteristics',
381 . /10X,'friction coefficient . . .',1PG14.4
382 . /10X,'filtration flag. . . . . .',I10
383 . /10X,'filtration factor. . . . .',1PG14.4)
void anodset(int *id, int *type)
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
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 subrotpoint(x, y, z, rtrans, sub_id, lsubmodel)