44
45
46
54 USE reader_old_mod , ONLY : line, kline, key0, kcur
55
56
57
58#include "implicit_f.inc"
59
60
61
62#include "units_c.inc"
63#include "com04_c.inc"
64#include "param_c.inc"
65#include "scr17_c.inc"
66#include "sphcom.inc"
67
68
69
70 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
71 INTEGER ISKN(LISKN,*),IXS(NIXS,NUMELS),IXR(NIXR,NUMELR),NOM_OPT(,*)
72 TYPE (CLUSTER_) ,DIMENSION(NCLUSTER) :: CLUSTERS
73 TYPE(SUBMODEL_DATA),INTENT(IN)::LSUBMODEL(NSUBMOD)
74
75 TYPE (GROUP_) , DIMENSION(NGRBRIC) :: IGRBRIC
76 TYPE (GROUP_) , DIMENSION(NGRSPRI) :: IGRSPRING
77
78
79
80 INTEGER I,J,K,II,JJ,KK,N,CLID,UID,ICLUS,IAD,IG,IGR,ISK,IFAIL,IEL,NEL,NNOD,IFLAGUNIT,VAL,NNOD0,,NELMAX
81 INTEGER NOD1(2000),NOD2(2000),SUB_INDEX,ISK_L
82 my_real bid(1),ax(4),nx(4),fmax(2),mmax(2)
83 CHARACTER(LEN=NCHARTITLE)::TITR
84 CHARACTER(LEN=NCHARFIELD) :: KEY
85 parameter(nelmax = 500)
86 LOGICAL :: IS_AVAILABLE,FOUND
87
88 is_available = .false.
89
90
91
92
93
95
96
97
98
99 DO i=1,ncluster
100 titr = ''
102 . option_id = clid,
103 . unit_id = uid,
104 . submodel_index = sub_index,
105 . keyword2 = key,
106 . option_titr = titr)
107
108 nom_opt(1,i)=clid
109 CALL fretitl(titr,nom_opt(lnopt1-ltitr+1,i),ltitr)
110
111 iflagunit = 0
112 IF (uid > 0) THEN
113 DO j=1,unitab%NUNITS
114 IF (unitab%UNIT_ID(j) == uid) THEN
115 iflagunit = 1
116 EXIT
117 ENDIF
118 ENDDO
119 ENDIF
120 IF (uid / = 0 .and. iflagunit == 0) THEN
121 CALL ancmsg(msgid=659,anmode=aninfo,msgtype=msgerror,i1=clid,i2=uid,c1=
'CLUSTER',c2=
'CLUSTER',c3=titr)
122 ENDIF
123
124
125 CALL hm_get_intv (
'group_ID' ,igr ,is_available, lsubmodel)
126 CALL hm_get_intv (
'skew_ID' ,isk ,is_available, lsubmodel)
127 CALL hm_get_intv (
'ifail' ,ifail ,is_available, lsubmodel)
128
129
130
131 CALL hm_get_floatv(
'fn_fail1' ,fmax(1) ,is_available, lsubmodel, unitab)
132 CALL hm_get_floatv(
'scalefactor_a1',ax(1) ,is_available, lsubmodel, unitab)
133 CALL hm_get_floatv(
'scalefactor_b1',nx(1) ,is_available, lsubmodel, unitab)
134
135
136
137 CALL hm_get_floatv(
'fs_fail' ,fmax(2) ,is_available, lsubmodel, unitab)
138 CALL hm_get_floatv(
'scalefactor_a2',ax(2) ,is_available, lsubmodel, unitab)
139 CALL hm_get_floatv(
'scalefactor_b2',nx(2) ,is_available, lsubmodel, unitab)
140
141
142
143 CALL hm_get_floatv(
'mt_fail' ,mmax(1) ,is_available, lsubmodel, unitab)
144 CALL hm_get_floatv(
'scalefactor_a3',ax(3) ,is_available, lsubmodel, unitab)
145 CALL hm_get_floatv(
'scalefactor_b3',nx(3) ,is_available, lsubmodel, unitab)
146
147
148
149 CALL hm_get_floatv(
'mb_fail' ,mmax(2) ,is_available, lsubmodel, unitab)
150 CALL hm_get_floatv(
'scalefactor_a4',ax(4) ,is_available, lsubmodel, unitab
151 CALL hm_get_floatv(
'scalefactor_b4',nx(4) ,is_available, lsubmodel, unitab)
152
153
154 isk_l = isk
155 IF (isk > 0) THEN
156 found = .false.
158 IF (isk == iskn(4,j+1)) THEN
159 isk = j+1
160 found = .true.
161 EXIT
162 ENDIF
163 ENDDO
164 IF (.NOT.found) THEN
165 CALL ancmsg(msgid=137,anmode=aninfo,msgtype=msgerror,c1=
'CLUSTER',c2=
'CLUSTER',i2=isk,i1=clid,c3=titr)
166 ENDIF
167 ENDIF
168 nod1 = 0
169 nod2 = 0
170 nnod = 0
171 nel = 0
172
173
174
175 kk = ngrnod+1
176 IF (key(1:5) == 'BRICK') THEN
177 DO ig = 1,ngrbric
178 ii = ig
179 IF (igr == igrbric(ig)%ID .and. igrbric(ig)%GRTYPE == 1) THEN
180 nel = igrbric(ig)%NENTITY
181 IF (nel > nelmax) THEN
182 CALL ancmsg(msgid=1055, anmode=aninfo, msgtype=msgerror, i1=clid, i2=nel)
183 EXIT
184 ENDIF
185 clusters(i)%ID = clid
186 clusters(i)%IGR = ii
187 clusters(i)%TYPE = 1
188 clusters(i)%SKEW = isk
189 clusters(i)%NEL = nel
190 clusters(i)%IFAIL= ifail
191 clusters(i)%OFF = 1
192 clusters(i)%FAIL = one
193
194 ALLOCATE (clusters(i)%NG(nel) )
195 ALLOCATE (clusters(i)%ELEM(nel) )
196 DO iel = 1,nel
197 jj = igrbric(ig)%ENTITY(iel)
198 clusters(i)%ELEM(iel) = jj
199
200 DO k=2,5
201 nnod = nnod+1
202 nod1(nnod) = ixs(k ,jj)
203 nod2(nnod) = ixs(k+4,jj)
204 ENDDO
205 ENDDO
206
207 nnod0=nnod
209 nnod = nnod0
211 clusters(i)%NNOD = nnod
212
213 ALLOCATE (clusters(i)%NOD1(nnod))
214 ALLOCATE (clusters(i)%NOD2(nnod))
215 DO k=1,nnod
216 clusters(i)%NOD1(k) = nod1(k)
217 clusters(i)%NOD2(k) = nod2(k)
218 END DO
219
220 WRITE(iout,1001) clid
221
222 EXIT
223 ENDIF
224 ENDDO
225
226 ELSEIF (key(1:6) == 'spring') THEN
227
228
229
230 KK = NGRNOD+NGRBRIC+NGRQUAD+NGRSHEL+NGRTRUS+NGRBEAM + 1
231 DO IG = 1,NGRSPRI
232 II = KK+IG-1
233.and. IF (IGR == IGRSPRING(IG)%ID IGRSPRING(IG)%GRTYPE == 6) THEN
234 NEL = IGRSPRING(IG)%NENTITY
235 IF (NEL > NELMAX) THEN
236 CALL ANCMSG(MSGID=1055,
237 . ANMODE=ANINFO,
238 . MSGTYPE=MSGERROR,
239 . I1=CLID,
240 . I2=NEL)
241 EXIT
242 ENDIF
243 CLUSTERS(I)%ID = CLID
244 CLUSTERS(I)%IGR = II
245 CLUSTERS(I)%TYPE = 2
246 CLUSTERS(I)%SKEW = ISK
247 CLUSTERS(I)%NEL = NEL
248 CLUSTERS(I)%IFAIL= IFAIL
249 CLUSTERS(I)%OFF = 1
250 CLUSTERS(I)%FAIL = ONE
251
252 ALLOCATE (CLUSTERS(I)%NG(NEL) )
253 ALLOCATE (CLUSTERS(I)%ELEM(NEL) )
254 DO IEL = 1,NEL
255 JJ = IGRSPRING(IG)%ENTITY(IEL)
256 CLUSTERS(I)%ELEM(IEL) = JJ !IXR(6,JJ) ! Elem ID
257 NNOD = NNOD+1
258 NOD1(NNOD) = IXR(2,JJ)
259 NOD2(NNOD) = IXR(3,JJ)
260 ENDDO
261
262 NNOD0=NNOD
263 CALL ITRIMHPSORT(NOD1,NNOD)
264 NNOD = NNOD0
265 CALL ITRIMHPSORT(NOD2,NNOD)
266 CLUSTERS(I)%NNOD = NNOD
267
268 ALLOCATE (CLUSTERS(I)%NOD1(NNOD) )
269 ALLOCATE (CLUSTERS(I)%NOD2(NNOD) )
270 DO K=1,NNOD
271 CLUSTERS(I)%NOD1(K) = NOD1(K)
272 CLUSTERS(I)%NOD2(K) = NOD2(K)
273 END DO
274
275 WRITE(IOUT,1002) CLID
276
277 EXIT ! group found => exit loop
278 ENDIF
279 ENDDO ! IG = 1,NGRSPRI
280 ENDIF
281
282 IF (NEL == 0) THEN
283 CALL ANCMSG(MSGID=1054,
284 . ANMODE=ANINFO,
285 . MSGTYPE=MSGERROR,
286 . I1=CLID,
287 . I2=IGR)
288 CYCLE
289 ENDIF
290
291 IF (IFAIL > 0) THEN
292 IF (FMAX(1) == ZERO) FMAX(1) = INFINITY
293 IF (FMAX(2) == ZERO) FMAX(2) = INFINITY
294 IF (MMAX(1) == ZERO) MMAX(1) = INFINITY
295 IF (MMAX(2) == ZERO) MMAX(2) = INFINITY
296 ALLOCATE (CLUSTERS(I)%FMAX(2) )
297 ALLOCATE (CLUSTERS(I)%MMAX(2) )
298 CLUSTERS(I)%FMAX(1) = FMAX(1)
299 CLUSTERS(I)%FMAX(2) = FMAX(2)
300 CLUSTERS(I)%MMAX(1) = MMAX(1)
301 CLUSTERS(I)%MMAX(2) = MMAX(2)
302 ELSE
303 ALLOCATE (CLUSTERS(I)%FMAX(0) )
304 ALLOCATE (CLUSTERS(I)%MMAX(0) )
305 ENDIF
306 IF (IFAIL == 3) THEN
307 ALLOCATE (CLUSTERS(I)%AX(4) )
308 ALLOCATE (CLUSTERS(I)%NX(4) )
309 IF (AX(1) == ZERO) AX(1) = ONE
310 IF (AX(2) == ZERO) AX(2) = ONE
311 IF (AX(3) == ZERO) AX(3) = ONE
312 IF (AX(4) == ZERO) AX(4) = ONE
313 IF (NX(1) == ZERO) NX(1) = ONE
314 IF (NX(2) == ZERO) NX(2) = ONE
315 IF (NX(3) == ZERO) NX(3) = ONE
316 IF (NX(4) == ZERO) NX(4) = ONE
317 CLUSTERS(I)%AX(1) = AX(1)
318 CLUSTERS(I)%AX(2) = AX(2)
319 CLUSTERS(I)%AX(3) = AX(3)
320 CLUSTERS(I)%AX(4) = AX(4)
321 CLUSTERS(I)%NX(1) = NX(1)
322 CLUSTERS(I)%NX(2) = NX(2)
323 CLUSTERS(I)%NX(3) = NX(3)
324 CLUSTERS(I)%NX(4) = NX(4)
325 ELSE
326 ALLOCATE (CLUSTERS(I)%AX(0) )
327 ALLOCATE (CLUSTERS(I)%NX(0) )
328 ENDIF
329
330 WRITE(IOUT,2000) IGR, ISK_L, NEL, NNOD*2, IFAIL
331 IF (IFAIL > 0) WRITE(IOUT,2001) FMAX(1),FMAX(2),MMAX(1),MMAX(2)
332 IF (IFAIL == 3) WRITE(IOUT,2002) AX(1),AX(2),AX(3),AX(4),
333 . NX(1),NX(2),NX(3),NX(4)
334
335 WRITE(IOUT,9000)
336
337 ENDDO ! I=1,NCLUSTER
338
339 1001 FORMAT(/
340 & 5X,'spotweld cluster of brick elements,
id=
',I10)
341 1002 FORMAT(/
342 & 5X,'spotweld cluster of spring elements,
id=
',I10)
343 2000 FORMAT(
344 & 10X,'element group
id. . . . . . . . . . . . .=
',I10/,
345 & 10X,'skew
id . . . . . . . . . . . . . . . . .=
',I10/,
346 & 10X,'number of elements. . . . . . . . . . . .=',I10/,
347 & 10X,'number of nodes . . . . . . . . . . . . .=',I10/,
348 & 10X,'failure flag . . . . . . . . . . . . . .=',I10)
349 2001 FORMAT(
350 & 10X,'max normal force. . . . . . . . . . . . .=
',1PG20.13/,
351 & 10X,'max tangent force . . . . . . . . . . . .=
',1PG20.13/,
352 & 10X,'max torsion moment. . . . . . . . . . . .=
',1PG20.13/,
353 & 10X,'max bending moment. . . . . . . . . . . .=
',1PG20.13)
354 2002 FORMAT(
355 & 10X,'failure coefficient a1. . . . . . . . . .=',1PG20.13/,
356 & 10X,'failure coefficient a2. . . . . . . . . .=',1PG20.13/,
357 & 10X,'failure coefficient a3. . . . . . . . . .=',1PG20.13/,
358 & 10X,'failure coefficient a4. . . . . . . . . .=',1PG20.13/,
359 & 10X,'failure exponent n1 . . . . . . . . . . .=',1PG20.13/,
360 & 10X,'failure exponent n2 . . . . . . . . . . .=',1PG20.13/,
361 & 10X,'failure exponent n3 . . . . . . . . . . .=',1PG20.13/,
362 & 10X,'failure exponent n4 . . . . . . . . . . .=',1PG20.13)
363 9000 FORMAT(10X/)
364
365 RETURN
366 998 CALL ANCMSG(MSGID=55,ANMODE=ANINFO,MSGTYPE=MSGERROR,C1=KEY0(KCUR),C2=KLINE,C3=LINE)
367
368 RETURN
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 itrimhpsort(tab, len)
integer, parameter nchartitle
integer, parameter ncharfield
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)