47
48
49
50 USE my_alloc_mod
58 use element_mod , only : nixr
59
60
61
62#include "implicit_f.inc"
63
64
65
66#include "param_c.inc"
67#include "units_c.inc"
68#include "scr17_c.inc"
69#include "com04_c.inc"
70#include "random_c.inc"
71#include "tabsiz_c.inc"
72
73
74
75 INTEGER, INTENT(IN) :: ITABM1(NUMNOD),IXR(NIXR,NUMELR),ITAB(NUMNOD),FUNC_ID(NFUNCT),IPM(NPROPMI,NUMMAT)
76 INTEGER, INTENT(INOUT) :: NOM_OPT(LNOPT1,SNOM_OPT1)
77 my_real,
INTENT(IN) :: alea(nrand)
78 my_real,
INTENT(INOUT) :: x(3,numnod)
79 TYPE(SUBMODEL_DATA), DIMENSION(NSUBMOD), INTENT(IN) :: LSUBMODEL
80 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
81
82
83
84 INTEGER ,DIMENSION(NRETRACTOR) :: RET_ID
85 INTEGER :: I,J,K,ID, UID, NODE_ID, EL_ID, IERR1
86 INTEGER :: NODE1,NODE2,EL_LOC,BID,ISENS(2),IFUNC(3),IFUNC_LOC(3),TENS_TYP,MID,MTYP
87 my_real :: force,elem_size,dist1,dist2,dist3,pull,yscale1,xscale1,xscale1_unit,yscale1_unit
88 my_real :: yscale2,xscale2,xscale2_unit,yscale2_unit,xx,dxdy,get_u_func,alea_max,tole_2
89 CHARACTER(LEN=NCHARTITLE) :: TITR
90 CHARACTER(LEN=NCHARKEY) :: KEY2
91 CHARACTER :: MESS*40
92 LOGICAL :: IS_AVAILABLE
93 EXTERNAL get_u_func
94
95
96
97 INTEGER USR2SYS,NINTRI
98
99 DATA mess/'RETRACTOR DEFINITION '/
100
101
102
103 ierr1 = 0
104
105 IF(nretractor > 0 ) THEN
106
107 WRITE(iout,1000)
108
110 DO i=1,nretractor
144 ENDDO
145
147
148 DO i = 1,nretractor
150
152 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,i),ltitr)
153
154 CALL hm_get_intv(
'EL_ID', el_id, is_available, lsubmodel)
155 CALL hm_get_intv(
'Node_ID', node_id, is_available, lsubmodel)
156 CALL hm_get_floatv(
'Elem_size', elem_size, is_available, lsubmodel,unitab)
157
158 CALL hm_get_intv(
'Sens_ID1', isens(1), is_available, lsubmodel)
159 CALL hm_get_floatv(
'Pullout', pull, is_available, lsubmodel,unitab)
160 CALL hm_get_intv(
'Fct_ID1', ifunc(1), is_available, lsubmodel)
161 CALL hm_get_intv(
'Fct_ID2', ifunc(2), is_available, lsubmodel)
162 CALL hm_get_floatv(
'Yscale1',yscale1,is_available,lsubmodel,unitab)
163 CALL hm_get_floatv(
'Xscale1',xscale1,is_available,lsubmodel,unitab)
164
167
168 CALL hm_get_intv(
'Sens_ID2', isens(2), is_available, lsubmodel)
169 CALL hm_get_intv(
'Tens_typ', tens_typ, is_available, lsubmodel)
170 CALL hm_get_floatv(
'Force', force, is_available, lsubmodel,unitab)
171 CALL hm_get_intv(
'Fct_ID3', ifunc(3), is_available, lsubmodel)
172 CALL hm_get_floatv(
'Yscale2',yscale2,is_available,lsubmodel,unitab)
173 CALL hm_get_floatv(
'Xscale2',xscale2,is_available,lsubmodel,unitab)
174
177
179
180 IF (ifunc(1) > 0) THEN
181 IF (xscale1== zero) xscale1 = one*xscale1_unit
182 IF (yscale1== zero) yscale1 = one*yscale1_unit
183 ENDIF
184
185 IF (ifunc(2) == 0) ifunc(2) = ifunc(1)
186
187 IF (ifunc(3) > 0) THEN
188 IF (xscale2== zero) xscale2 = one*xscale2_unit
189 IF (yscale2== zero) yscale2 = one*yscale2_unit
190 ENDIF
191
192 WRITE(iout,1100)
id,trim(titr),el_id,node_id,elem_size,isens(1),pull,ifunc(1),ifunc(2),
193 . xscale1,yscale1
194
195 IF (isens(2) > 0) WRITE(iout,1200) isens(2),tens_typ,force,ifunc(3),xscale2,yscale2
196
197 IF (force == zero) force = ep30
198
200 el_loc=
nintri(el_id,ixr,nixr,numelr,nixr)
201
202 IF(el_loc == 0) THEN
204 . msgtype=msgerror,
205 . anmode=aninfo_blind_1,
207 ELSE
208 mtyp = 0
209 mid = ixr(5,el_loc)
210 IF (mid > 0) mtyp = ipm(2,mid)
211 IF (mtyp /= 114)
CALL ancmsg(msgid=2033,
212 . msgtype=msgerror,
213 . anmode=aninfo,
215 ENDIF
216
217
218
219
220
221 ifunc_loc(1:3) = 0
222
223 DO j=1,3
224 IF (ifunc(j) > 0) THEN
225 DO k=1,nfunct
226 IF (func_id(k) == ifunc(j)) ifunc_loc(j) = k
227 ENDDO
228 IF(ifunc_loc(j) == 0)
CALL ancmsg(msgid=2028,
229 . msgtype=msgerror,
230 . anmode=aninfo_blind_1,
231 . c1='FUNCTION',
233 ENDIF
234 ENDDO
235
236 IF ((isens(1) > 0).AND.(ifunc(1)==0)) THEN
237
239 . msgtype=msgerror,
240 . anmode=aninfo_blind_1,
242 ENDIF
243
244 IF ((isens(2) > 0).AND.(ifunc(3)==0)) THEN
245
247 . msgtype=msgerror,
248 . anmode=aninfo_blind_1,i1=
id)
249 ENDIF
250
254
261
268
271 ELSE
272
273 xx = zero
275 ENDIF
276
277 node1 = ixr(2,el_loc)
278 node2 = ixr(3,el_loc)
279
280 dist1 = (x(1,node1)-x(1,node_id))**2+(x(2,node1)-x(2,node_id))**2+(x(3,node1)-x(3,node_id))**2
281 dist2 = (x(1,node2)-x(1,node_id))**2+(x(2,node2)-x(2,node_id))**2+(x(3,node2)-x(3,node_id))**2
282
283
285
286 IF (nrand > 0) THEN
287 alea_max = zero
288 DO j=1,nrand
289 alea_max =
max(alea_max,alea(j))
290 ENDDO
291 tole_2 =
max(tole_2,ten*alea_max*alea_max)
292 ENDIF
293
294
295 IF ((dist1 < dist2).AND.(dist1 <= tole_2)) THEN
296 x(1,node1) = x(1,node_id)
297 x(2,node1) = x(2,node_id)
298 x(3,node1) = x(3,node_id)
299 dist1 = zero
300 ELSEIF (dist2 <= tole_2) THEN
301 x(1,node2) = x(1,node_id)
302 x(2,node2) = x(2,node_id)
303 x(3,node2) = x(3,node_id)
304 dist2 = zero
305 ENDIF
306
307 dist3 = (x(1,node2)-x(1,node1))**2+(x(2,node2)-x(2,node1))**2+(x(3,node2)-x(3,node1))**2
308
309 IF (dist1 < em30) THEN
313 retractor(i)%VECTOR(1) = (x(1,node2)-x(1,node1))/sqrt(
max(em30,dist3))
314 retractor(i)%VECTOR(2) = (x(2,node2)-x(2,node1))/sqrt(
max(em30,dist3))
315 retractor(i)%VECTOR(3) = (x(3,node2)-x(3,node1))/sqrt(
max(em30,dist3))
316
318 ELSEIF (dist2 < em30) THEN
322 retractor(i)%VECTOR(1) = (x(1,node1)-x(1,node2))/sqrt(
max(em30,dist3))
323 retractor(i)%VECTOR(2) = (x(2,node1)-x(2,node2))/sqrt(
max(em30,dist3))
324 retractor(i)%VECTOR(3) = (x(3,node1)-x(3,node2))/sqrt(
max(em30,dist3))
325
327 ELSE
329 . msgtype=msgerror,
330 . anmode=aninfo_blind_1,
332 ENDIF
333
334 IF (dist3 < em30) THEN
336 . msgtype=msgerror,
337 . anmode=aninfo_blind_1,
339 ENDIF
340
343 . msgtype=msgerror,
344 . anmode=aninfo_blind_1,
346 ENDIF
347
348 ENDDO
349
350 ENDIF
351
352 IF (ierr1 /= 0) THEN
353 WRITE(iout,*)' ** ERROR IN MEMORY ALLOCATION'
354 WRITE(istdo,*)' ** error in memory allocation'
355 CALL ARRET(2)
356 ENDIF
357
358
359
360
361 CALL UDOUBLE(RET_ID,1,NRETRACTOR,MESS,0,BID)
362 RETURN
363
3641000 FORMAT(/
366 . ' ---------------------- ')
368 . /5X,'connected spring element . . . . . . . . .',I10
369 . /5X,'anchorage node . . . . . . . . . . . . . .',I10
370 . /5X,'element SIZE . . . . . . . . . . . . . . .',1PG20.4
371 . /5X,'sensor id1 . . . . . . . . . . . . . . . .',I10
372 . /5X,'pullout before locking . . . . . . . . . .',1PG20.4
373 . /5X,'func1 - loading - force vs pullout . . . .',I10
374 . /5X,'func2 - unloading - force vs pullout . . .',I10
375 . /5X,'func1/2 abcissa scale factor . . . . . . .',1PG20.4
376 . /5X,'func1/2 ordinate scale factor. . . . . . .',1PG20.4)
3771200 FORMAT( 5X,'pretension :'
378 . /5X,'sensor id2 . . . . . . . . . . . . . . . .',I10
379 . /5X,'pretension type. . . . . . . . . . . . . .',I10
380 . /5X,'maximum force. . . . . . . . . . . . . . .',1PG20.4
381 . /5X,'func3. . . . . . . . . . . . . . . . . . .',I10
382 . /5X,'func3 abcissa scale factor . . . . . . . .',1PG20.4
383 . /5X,'func3 ordinate scale factor . . . . . . .',1PG20.4)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_floatv_dim(name, dim_fac, 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
type(retractor_struct), dimension(:), allocatable retractor
integer function nintri(iext, antn, m, n, m1)
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)