155
156
157
158 USE my_alloc_mod
162
163
164
165#include "implicit_f.inc"
166
167
168
169#include "com04_c.inc"
170#include "com06_c.inc"
171#include "scr15_c.inc"
172#include "sphcom.inc"
173
174
175
176 INTEGER FLG_CHK,FLG_CTL,ISOLOFF(*),ISHEOFF(*),ITRUOFF(*),
177 . IPOUOFF(*),IRESOFF(*),ITRIOFF(*)
178
180
181
182
183 INTEGER IO_ERR1,I,DT_INDEX(11),FLAG_TRI(11),NUME(11),NUMEL
184 CHARACTER FILNAM*109, KEYA*80, KEYA2*80
186 . dtsca,dtmini,dtini,dtmax,dt_min_elem(11),dtfac1(11)
187 INTEGER :: LEN_TMP_NAME
188 CHARACTER(len=4096) :: TMP_NAME
189 INTEGER :: IERROR
190 INTEGER, DIMENSION(:), ALLOCATABLE :: PERM
191
192
193 flg_chk = 0
194 flg_ctl = 0
195 dtmax = ep30
196 dt_index(:) = 0
197 dt_min_elem(:) = ep30
198 flag_tri(:) = 0
199 dtfac1(:) = dtfac
200 numel= numelc+numels+numelt+numelq+numelp+numelr+numeltg
201 . +numelx+numsph+numelig3d
202 CALL my_alloc( perm,numel+1)
203
204
205
206
207 nume(1) = numels
208 nume(2) = numelq
209 nume(3) = numelc
210 nume(4) = numelt
211 nume(5) = numelp
212 nume(6) = numelr
213 nume(7) = numeltg
214 nume(8) = 0
215 nume(9) = numelx
216 nume(10) = numsph
217 nume(11) = numelig3d
218 dt_index(1) = 0
219 DO i=2,11
220 dt_index(i) = dt_index(i-1) + nume(i-1)
221 END DO
222
223
224
225
226 DO i = 1, numels
227 IF (isoloff(i)/=0) THEN
228 dtelem(i+dt_index(1)) = ep30
229 flag_tri(1) = 1
230 ENDIF
231 END DO
232
233 DO i = 1, numelq
234 IF (iquaoff(i)/=0) THEN
235 dtelem(i+dt_index(2)) = ep30
236 flag_tri(2) = 1
237 ENDIF
238 END DO
239
240 DO i = 1, numelc
241 IF (isheoff(i)/=0) THEN
242 dtelem(i+dt_index(3)) = ep30
243 flag_tri(3) = 1
244 END IF
245 END DO
246
247 DO i = 1, numelt
248 IF (itruoff(i)/=0) THEN
249 dtelem(i+dt_index(4)) = ep30
250 flag_tri(4) = 1
251 END IF
252 END DO
253
254 DO i = 1, numelp
255 IF (ipouoff(i)/=0) THEN
256 dtelem(i+dt_index(5)) = ep30
257 flag_tri(5) = 1
258 END IF
259 END DO
260
261 DO i = 1, numelr
262 IF (iresoff(i)/=0) THEN
263 dtelem(i+dt_index(6)) = ep30
264 flag_tri(6) = 1
265 END IF
266 END DO
267
268 DO i = 1, numeltg
269 IF (itrioff(i)/=0) THEN
270 dtelem(i+dt_index(7)) = ep30
271 flag_tri(7) = 1
272 END IF
273 END DO
274
275 DO i=1,11
276 IF (flag_tri(i)==1) THEN
277 CALL myqsort(nume(i),dtelem(1+dt_index(i)),perm(1+dt_index(i)),ierror)
278 dtelem(numel+1+dt_index(i):numel+nume(i)+1+dt_index(i)) = perm(1+dt_index(i):nume(i)+1+dt_index(i))
279 ENDIF
280 END DO
281
282
283
284
285 DO i=1,11
286 dt_min_elem(i) = dtelem(1+dt_index(i))
287 END DO
288
289
290
291
292 filnam=rootnam(1:rootlen)//'_0001.rad'
295 OPEN(unit=71,file=tmp_name(1:len_tmp_name),
296 . access='SEQUENTIAL',status='OLD',iostat=io_err1)
297
298 IF (io_err1/=0) THEN
299 filnam=rootnam(1:rootlen)//'D01'
302 OPEN(unit=71,file=tmp_name(1:len_tmp_name),
303 . access='SEQUENTIAL',status='OLD'
304 ENDIF
305
306 IF (io_err1==0) THEN
307
308 flg_chk = 1
309 10 READ(71,'(A)',END=20) keya
310
311 IF (keya(1:3)=='/DT') THEN
312 READ(71,'(A)',END=20) keya2
313 IF(keya2(1:1)/='$'.AND.keya2(1:1)/='#') THEN
314 backspace(71)
315 ENDIF
316 ENDIF
317
318
319 IF(keya(1:8)=='/DT/NODA') THEN
320 READ(71,*,END=20) DTSCA,dtmini
322 IF(keya(1:12)=='/DT/NODA/CST') THEN
323 flg_ctl = 1
325 ENDIF
326
327 ELSEIF(keya(1:9)=='/DT/BRICK') THEN
328 READ(71,*,END=20) DTSCA,dtmini
329 dtfac1(1) = dtsca
330 IF (keya(10:13)=='/DEL') THEN
331 DO i = 1,numels
332 IF (dtsca*dtelem(dt_index(1)+i)>dtmini) THEN
333 dt_min_elem(1) = dtelem(dt_index(1)+i)
334 EXIT
335 ENDIF
336 END DO
337 ENDIF
338
339 ELSEIF(keya(1:9)=='/DT/QUAD') THEN
340 READ(71,*,END=20) DTSCA,dtmini
341 dtfac1(2) = dtsca
342 IF (keya(10:13)=='/DEL') THEN
343 DO i = 1,numelq
344 IF (dtsca*dtelem(dt_index(2)+i)>dtmini) THEN
345 dt_min_elem(2) = dtelem(dt_index(2)+i)
346 EXIT
347 ENDIF
348 END DO
349 ENDIF
350
351 ELSEIF(keya(1:9)=='/DT/SHELL') THEN
352 READ(71,*,END=20) DTSCA,dtmini
353 dtfac1(3) = dtsca
354 IF ((keya(10:14)/='/STOP').AND.(keya(10:13)/='/CST')) THEN
355 DO i = 1,numelc
356 IF (dtsca*dtelem(dt_index(3)+i)>dtmini) THEN
357 dt_min_elem(3) = dtelem(dt_index(3)+i)
358 EXIT
359 ENDIF
360 END DO
361 ENDIF
362
363 ELSEIF (keya(1:8)=='/DT/BEAM') THEN
364 READ(71,*,END=20) DTSCA,dtmini
365 dtfac1(4) = dtsca
366 IF (keya(9:12)=='/DEL') THEN
367 DO i = 1,numelt
368 IF (dtsca*dtelem(dt_index(4)+i)>dtmini) THEN
369 dt_min_elem(4) = dtelem(dt_index(4)+i)
370 EXIT
371 ENDIF
372 END DO
373 ENDIF
374
375 ELSEIF (keya(1:9)=='/DT/TRUSS') THEN
376 READ(71,*,END=20) DTSCA,dtmini
377 dtfac1(5) = dtsca
378 IF (keya(10:13)=='/DEL') THEN
379 DO i = 1,numelp
380 IF (dtsca*dtelem(dt_index(5)+i)>dtmini) THEN
381 dt_min_elem(5) = dtelem(dt_index(5)+i)
382 EXIT
383 ENDIF
384 END DO
385 ENDIF
386
387 ELSEIF (keya(1:10)=='/DT/SPRING') THEN
388 READ(71,*,END=20) DTSCA,dtmini
389 dtfac1(6) = dtsca
390 IF (keya(11:14)=='/DEL') THEN
391 DO i = 1,numelr
392 IF (dtsca*dtelem(dt_index(6)+i)>dtmini) THEN
393 dt_min_elem(6) = dtelem(dt_index(6)+i)
394 EXIT
395 ENDIF
396 END DO
397 ENDIF
398
399 ELSEIF(keya(1:9)=='/DT/SH_3N') THEN
400 READ(71,*,END=20) DTSCA,dtmini
401 dtfac1(7) = dtsca
402 IF ((keya(10:14)/='/STOP').AND.(keya(10:13)/='/CST')) THEN
403 DO i = 1,numeltg
404 IF (dtsca*dtelem(dt_index(7)+i)>dtmini) THEN
405 dt_min_elem(7) = dtelem(dt_index(7)+i)
406 EXIT
407 ENDIF
408 END DO
409 ENDIF
410
411 ELSEIF (keya(1:10)=='/DT/SPHCEL') THEN
412 READ(71,*,END=20) DTSCA,dtmini
413 dtfac1(10) = dtsca
414 IF (keya(11:14)=='/DEL') THEN
415 DO i = 1,numsph
416 IF (dtsca*dtelem(dt_index(10)+i)>dtmini) THEN
417 dt_min_elem(10) = dtelem(dt_index(10)+i)
418 EXIT
419 ENDIF
420 END DO
421 ENDIF
422
423 ELSEIF(keya(1:4)=='/DT ') THEN
424 flg_ctl = 1
425 READ(71,*,END=20) DTSCA,dtmini
426 DO i=1,11
427 dtfac1(i) = dtsca
428 END DO
429
430 ELSEIF(keya(1:5)=='/DTIX') THEN
431 flg_ctl = 1
432 READ(71,*,END=20) DTINI,dtmax
433 ENDIF
434
435 GOTO 10
436
437 20 CONTINUE
438 CLOSE(71)
439
440 ENDIF
441
442
443
444
445 dt = ep30
446 DO i=1,11
447 dt =
min(dt,dtfac1(i)*dt_min_elem(i))
448 END DO
449
451
453
454 DEALLOCATE( perm )
455
456
457 RETURN
subroutine dtnoda(nodft, nodlt, neltst, ityptst, itab, ms, in, stifn, stifr, dt2t, dmast, dinert, adt, adm, imsch, weight, a, ar, igrnod, nodadt_therm, adi, rbym, arby, arrby, weight_md, mcp, mcp_off, condn, nale, h3d_data)
subroutine myqsort(n, a, perm, error)
character(len=infile_char_len) infile_name