56
57
58
59
63 use glob_therm_mod
64
65
66
67#include "implicit_f.inc"
68#include "comlock.inc"
69
70
71
72#include "mvsiz_p.inc"
73
74
75
76#include "com01_c.inc"
77#include "com04_c.inc"
78#include "com08_c.inc"
79#include "cong1_c.inc"
80#include "impl1_c.inc"
81#include "param_c.inc"
82#include "scr02_c.inc"
83#include "scr07_c.inc"
84#include "scr17_c.inc"
85#include "scr18_c.inc"
86#include "sms_c.inc"
87#include "units_c.inc"
88#include "inter22.inc"
89
90
91
92 INTEGER, INTENT(IN) :: NEL
93 INTEGER, INTENT(IN) :: ITY
94 INTEGER, INTENT(IN) :: ISMSTR
95 INTEGER, INTENT(IN) :: JTUR
96 INTEGER, INTENT(IN) :: JTHE
97 INTEGER, INTENT(IN) :: JSMS,NPG
98 INTEGER :: NELTST,ITYPTST,PID(*),MAT(*), NGL(*),IGEO(NPROPGI,NUMGEO),G_DT,IPM(NPROPMI,NUMMAT)
100 my_real :: pm(npropm,nummat), off(*), rho(*), rk(*), temp(*), re(*),sti(*),
101 . offg(*),geo(npropg,numgeo),
102 . vol(*), vd2(*), deltax(*), ssp(*), aire(*), vis(*),
103 . psh(*), pnew(*),qvis(*) ,ssp_eq(*),conde(*),
104 . d1(*), d2(*), d3(*), vol0(*), mssa(*), dmels(*),facq0
105 my_real,
INTENT(IN) :: rhoref(mvsiz), rhosp(mvsiz)
107 type (glob_therm_) ,intent(inout) :: glob_therm
108
109
110
111 INTEGER :: I,J, MT,ICOUNT,LIST(MVSIZ),ERROR, ALE_OR_EULER, ID_MIN
112 INTEGER :: JALE_FROM_MAT, JALE_FROM_PROP
113 my_real :: dd(mvsiz), al(mvsiz),
114 . dtx(mvsiz), ad(mvsiz), qx(mvsiz), cx(mvsiz), rho0(mvsiz), nrho(mvsiz),
115 . dty(mvsiz), qa, qb, visi, facq,qaa,
116 . cns1, cns2, sph, ak1, bk1, ak2, bk2, tli, akk, xmu, tmu, rpr,
117 . atu, dt, nui
118 my_real :: tidt,tvol,trho,taire, dtmin(mvsiz),facpg
120#ifdef MYREAL8
121 my_real,
PARAMETER :: real_three = 3.0d0
122 my_real,
PARAMETER :: real_one = 1.0d0
123#else
124 my_real,
PARAMETER :: real_three = 3.0
125 my_real,
PARAMETER :: real_one = 1.0
126#endif
127
128
129
130
131 mt = mat(1)
132 ale_or_euler = 0
133 jale_from_mat = nint(pm(72,mt))
134 jale_from_prop = igeo(62,pid(1))
135 IF(jale_from_mat == 1 .OR. jale_from_mat == 2) ale_or_euler = 1
136 IF(jale_from_prop == 1 .OR. jale_from_prop == 2)ale_or_euler = 1
137 IF(
ale%GLOBAL%I_DT_NODA_ALE_ON==1) ale_or_euler
138
139 IF(impl==zero)THEN
140 DO i=1,nel
141 dd(i)=-d1(i)-d2(i)-d3(i)
142 ad(i)=zero
143 al(i)=zero
144 cx(i)=ssp(i) + sqrt(vd2(i))
145 ENDDO
146 IF((impl_s>0.AND.idyna==0).OR.ismdisp>0)THEN
147 visi=zero
148 facq=zero
149 ELSE
150 visi=one
151 facq=facq0
152 ENDIF
153 IF(imconv<0) THEN
154 DO i=1,nel
155 vol(i)= abs(vol(i))
156 ENDDO
157 ENDIF
158 ELSE
159 DO i=1,nel
160 dd(i)=-d1(i)-d2(i)-d3(i)
161 ad(i)=zero
162 al(i)=zero
163 cx(i)=sqrt(vd2(i))
164 ENDDO
165 visi=zero
166 facq=zero
167 ENDIF
168
169 IF(n2d>0) THEN
170 facpg=one
171 DO i=1,nel
172 IF(off(i)==one)THEN
173 al(i)=sqrt(aire(i))
174 ad(i)=
max(zero,dd(i))
175 ENDIF
176 ENDDO
177 ELSE
178 facpg = npg
179 IF (facpg>one) facpg=facpg**(real_one/real_three)
180 DO i=1,nel
181 IF(off(i)==one)THEN
182 IF(vol(i) > zero)THEN
183 al(i) = vol(i)**(real_one/real_three)
184 ELSE
185 al(i)=zero
186 END IF
187 ad(i)=
max(zero,dd(i))
188 ENDIF
189 ENDDO
190 ENDIF
191
192
193
194 IF(.NOT.(idtmins==2.AND.jsms/=0))THEN
195 mt = mat(1)
196 DO i=1,nel
197 rho0(i)=pm(1,mt)
198 nrho(i)=sqrt(rhoref(i)*rho0(i))
199 ENDDO
200 qa =facq*geo(14,pid(1))
201 qb =facq*geo(15,pid(1))
202 cns1_0=facpg*geo(16,pid(1))
203 cns2_0=facpg*geo(17,pid(1))
204 psh(1:nel)=pm(88,mt)
205 pnew(1:nel)=zero
206 qaa_0 = qa*qa
207 dtmin(1:nel) = geo(172,pid(1))
208 DO i=1,nel
209 cns1=cns1_0*al(i)*nrho(i)*ssp(i)*off(i)
210 cns2=cns2_0*al(i)*nrho(i)*ssp(i)*off(i)
211
212
213
214
215 qaa = qaa_0*ad(i)
216 qx(i)=qb*ssp(i)+al(i) * qaa
217 . + visi*two*vis(i) /
max(em20,rho(i)*deltax(i))
218 . + (cns1+visi*cns2) /
max(em20,rhoref(i)*deltax(i))
219 qvis(i)=rho(i)*ad(i)*al(i)*(qaa*al(i)+qb*ssp(i))
220 ENDDO
221 ELSE
222 mt = mat(1)
223 DO i=1,nel
224 rho0(i)=pm(1,mt)
225 nrho(i)=sqrt(rhoref(i)*rho0(i))
226 ENDDO
227
228 qa =facq*geo(14,pid(1))
229 qb =facq*geo(15,pid(1))
230 psh(1:nel)=pm(88,mt)
231 pnew(1:nel)=zero
232 qaa_0 = qa*qa
233 dtmin(1:nel) = geo(172,pid(1))
234
235 IF(geo(16,pid(1)) >= zero)THEN
236 cns1_0=facpg*geo(16,pid(1))
237 cns2_0=facpg*geo(17,pid(1))
238 DO i=1,nel
239 cns1=cns1_0*al(i)*nrho(i)*ssp(i)*off(i)
240 cns2=cns2_0*al(i)*nrho(i)*ssp(i)*off(i)
241 qaa = qaa_0*ad(i)
242 nui =rho(i)*al(i)*(qaa*al(i)+qb*ssp(i))
243 qvis(i)=nui*ad(i)
244 qx(i) =(nui + cns1+visi*(two*vis(i)+cns2))/
max(em20,rhoref(i)*deltax(i))
245 ENDDO
246 ELSE
247 cns1_0=abs(geo(16,pid(1)))
248 cns2_0=abs(geo(17,pid(1)))
249 DO i=1,nel
250 cns1=cns1_0*nrho(i)*ssp(i)**2*off(i)
251 cns2=cns2_0*nrho(i)*ssp(i)**2*off(i)
252 qaa = qaa_0*ad(i)
253 nui =rho(i)*al(i)*(qaa*al(i)+qb*ssp(i))
254 qvis(i)=nui*ad(i)
255 qx(i) =(nui + cns1+visi*(two*vis(i)+cns2))/
max(em20,rhoref(i)*deltax(i))
256 ENDDO
257 END IF
258 ENDIF
259
260 DO i=1,nel
261 ssp_eq(i) =
max(em20,qx(i)+sqrt(qx(i)*qx(i)+cx(i)*cx(i)))
262 dtx(i) = deltax(i) / ssp_eq(i)
263 ENDDO
264
265
266
267
268
269
270
271
272 IF(int22 > 0)THEN
273
274 DO i=1,nel
275 IF(dtx(i)<dt22_min)THEN
276 idt_int22 = 0
277
278
279 EXIT ! just set idt_int22
280 ENDIF
281 ENDDO
282 ENDIF
283
284 IF(jthe > 0)THEN
285 mt = mat(1)
286 sph = pm(69,mt)
287 ak1 = pm(75,mt)
288 bk1 = pm(76,mt)
289 ak2 = pm(77,mt)
290 bk2 = pm(78,mt)
291 tli = pm(80,mt)
292 DO i=1,nel
293 IF(temp(i)<tli)THEN
294 akk=ak1+bk1*temp(i)
295 ELSE
296 akk=ak2+bk2*temp(i)
297 ENDIF
298 IF(jtur/=0)THEN
299 xmu = rho(i)*pm(24,mt)
300 tmu = pm(81,mt)
301 rpr = pm(95,mt)
302 atu=rpr*tmu*rk(i)*rk(i)/(
max(em15,re(i)*vol(i))*xmu)
303 akk=akk*(1.+atu)
304 ENDIF
305 dtx(i) =
min(dtx(i),half*deltax(i)*deltax(i)*sph/
max(akk,em20))
306 ENDDO
307 ENDIF
308
309 IF(.NOT.(idtmins==2.AND.jsms/=0))THEN
310 IF(kdtsmstr==1.AND.ismstr==1.OR.
311 . ((ismstr==2.OR.ismstr==12).AND.idtmin(1)==3))THEN
312
313 mt = mat(1)
314 DO i=1,nel
315 rho0(i)=pm(1,mt)
316 END DO
317 DO 50 i=1,nel
318 sti(i) = zero
319 IF(off(i)==zero.OR.offg(i)<zero) GO TO 50
320 IF(ipm(251,mt)/=0) GO TO 50
321 IF(n2d==0) THEN
322 tidt = one/dtx(i)
323 IF(offg(i)>one)THEN
324 trho = rho0(i) * tidt
325 tvol = vol0(i) * tidt
326 ELSE
327 trho = rho(i) * tidt
328 tvol = vol(i) * tidt
329 END IF
330
331
332 sti(i) = trho * tvol
333 ELSE
334
335 tidt = one/dtx(i)
336 trho = rho(i) * tidt
337 taire = aire(i) * tidt
338 sti(i) = half * trho * taire
339 ENDIF
340
341 50 CONTINUE
342 IF(ale_or_euler==0)THEN
343 DO i=1,nel
344 dtx(i)= dtfac1(ity)*dtx(i)
345 ENDDO
346 ELSE
347 DO i=1,nel
348 dtx(i)= dtfac1(102)*dtx(i)
349 ENDDO
350 ENDIF
351
352 IF(ale_or_euler==1 .OR. nodadt==0)THEN
353 DO i=1,nel
354 IF(vol(i)>zero .AND. (off(i)/=zero.AND.offg(i)>=zero))dt2t=
min(dtx(i),dt2t)
355 ENDDO
356 ENDIF
357
358 ELSE
359 IF(ismstr == 11) THEN
360 IF(n2d == 0) THEN
361 DO i=1,nel
362 sti(i) = zero
363 IF(off(i)==zero.OR.offg(i)<zero) cycle
364 IF(ipm(251,mt)/=0) cycle
365 tidt = one/dtx(i)
366 trho = rho0(i) * tidt
367 tvol = vol0(i) * tidt
368 sti(i) = trho * tvol
369 ENDDO
370 ELSE
371 DO i=1,nel
372 sti(i) = zero
373 IF(off(i)==zero.OR.offg(i)<zero) cycle
374 IF(ipm(251,mt)/=0) cycle
375 tidt = one/dtx(i)
376 trho = rho(i) * tidt
377 taire = aire(i) * tidt
378 sti(i) = half * trho * taire
379 ENDDO
380 ENDIF
381 ELSE
382 DO 60 i=1,nel
383 sti(i) = zero
384 IF(off(i)==zero.OR.offg(i)<zero) GO TO 60
385 IF(ipm(251,mt)/=0) GO TO 60
386 IF(n2d==0) THEN
387 tidt = one/dtx(i)
388 trho = rho(i) * tidt
389 tvol = vol(i) * tidt
390 sti(i) = trho * tvol
391
392
393 ELSE
394 tidt = one/dtx(i)
395 trho = rho(i) * tidt
396 taire = aire(i) * tidt
397 sti(i) = half * trho * taire
398 ENDIF
399
400 60 CONTINUE
401 ENDIF
402 IF(ale_or_euler==0)THEN
403 DO i=1,nel
404 dtx(i)= dtfac1(ity)*dtx(i)
405 ENDDO
406 ELSE
407 DO i=1,nel
408 dtx(i)= dtfac1(102)*dtx(i)
409 ENDDO
410 ENDIF
411
412 IF(ale_or_euler==1 .OR. nodadt==0)THEN
413 DO i=1,nel
414 IF(vol(i)>zero .AND. (off(i)/=zero.AND.offg(i)>=zero))dt2t=
min(dtx(i),dt2t)
415 ENDDO
416 ENDIF
417 END IF
418
419 ELSE
420 DO i=1,nel
421 dty(i)= dtx(i)
422 dtx(i)= dtfac1(ity)*dtx(i)
423 END DO
424 END IF
425
426 IF(imconv==1)THEN
427 IF(idtmin(ity)==1)THEN
428 error=0
429 DO 70 i=1,nel
430 IF(dtx(i)>dtmin1(ity).OR.off(i)==zero.
431 . or.offg(i)<zero) GO TO 70
432 error=1
433 70 CONTINUE
434
435 IF (error==1) THEN
436 tstop = tt
437 DO i=1,nel
438 IF(dtx(i)>dtmin1(ity).OR.off(i)==zero.
439 . or.offg(i)<zero) cycle
440#include "lockon.inc"
441 WRITE(iout,*)
442 . ' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR SOLID ELEMENT',
443 . ngl(i)
444#include "lockoff.inc"
445 END DO
446#include "lockon.inc"
447 WRITE(istdo,*)
448 . ' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR SOLID ELEMENTS'
449#include "lockoff.inc"
450 ENDIF
451 ELSEIF(idtmin(ity)==2)THEN
452 icount=0
453 DO 75 i=1,nel
454 IF(dtmin(i)/=zero) THEN
455 IF(dtx(i)>dtmin(i).OR.off(i)==zero.
456 . or.offg(i)<zero) GO TO 75
457 ELSE
458 IF(dtx(i)>dtmin1(ity).OR.off(i)==zero.
459 . or.offg(i)<zero) GO TO 75
460 ENDIF
461 off(i) = zero
462 icount=icount+1
463 list(icount)=i
464 75 CONTINUE
465
466 DO j=1,icount
467 i = list(j)
468#include "lockon.inc"
469 WRITE(iout,*)
470 . ' -- DELETE SOLID ELEMENTS',ngl(i)
471 WRITE(istdo,*)
472 . ' -- DELETE SOLID ELEMENTS',ngl(i)
473#include "lockoff.inc"
474 idel7nok = 1
475 ENDDO
476 ELSEIF(idtmin(ity)==3.AND.(ismstr==2.OR.ismstr==12))THEN
477 icount = 0
478 DO 76 i=1,nel
479 IF(dtmin(i)/=zero) THEN
480 IF(dtx(i)>dtmin(i).OR.
481 . off(i)<one.OR.offg(i)<=zero.OR.offg(i)==two) GO TO 76
482 ELSE
483 IF(dtx(i)>dtmin1(ity).OR.
484 . off(i)<one.OR.offg(i)<=zero.OR.offg(i)==two) GO TO 76
485 ENDIF
486 offg(i) = two
487 icount=icount+1
488 list(icount)=i
489 76 CONTINUE
490
491 DO j=1,icount
492 i=list(j)
493#include "lockon.inc"
494 WRITE(iout,*)
495 . '-- CONSTANT TIME STEP FOR SOLID ELEMENT NUMBER ',ngl(i)
496 WRITE(istdo,*)
497 . '-- CONSTANT TIME STEP FOR SOLID ELEMENT NUMBER ',ngl(i)
498#include "lockoff.inc"
499 ENDDO
500 ELSEIF(idtmin(ity)==5)THEN
501 error=0
502 DO 570 i=1,nel
503 IF(dtx(i)>dtmin1(ity).OR.off(i)==zero.
504 . or.offg(i)<zero) GO TO 570
505 error=1
506 570 CONTINUE
507 IF (error==1) THEN
508 mstop = 2
509 DO i=1,nel
510 IF(dtx(i)>dtmin1(ity).OR.off(i)==zero.
511 . or.offg(i)<zero) cycle
512#include "lockon.inc"
513 WRITE(iout,*)
514 . ' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR SOLID ELEMENT',
515 . ngl(i)
516#include "lockoff.inc"
517 END DO
518#include "lockon.inc"
519 WRITE(istdo,*)
520 . ' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR SOLID ELEMENTS'
521#include "lockoff.inc"
522 ENDIF
523 ENDIF
524 END IF
525
526 IF(idtmins == 2 .AND. jsms /= 0)THEN
527 IF(ismstr==1.OR.
528 + ((ismstr==2.OR.ismstr==12).AND.idtmin(1)==3))THEN
529 mt = mat(1)
530 DO i=1,nel
531 rho0(i)=pm(1,mt)
532 END DO
533 DO i=1,nel
534 sti(i) = zero
535 IF(off(i)==zero.OR.offg(i)<zero) cycle
536 IF(ipm(251,mt)/=0) cycle
537
538 IF(n2d==0) THEN
539 tidt = one/dty(i)
540 IF(offg(i)>one)THEN
541 trho = rho0(i) * tidt
542 tvol = vol0(i) * tidt
543 ELSE
544 trho = rho(i) * tidt
545 tvol = vol(i) * tidt
546 END IF
547 sti(i) = trho * tvol
548
549
550 ELSE
551 tidt = one/dty(i)
552 trho = rho(i) * tidt
553 taire = aire(i) * tidt
554 sti(i) = half * trho * taire
555 ENDIF
556
557
558
559
560 dmels(i)=
max(dmels(i),
561 . two*mssa(i)*((dtmins/(dtfacs*dty(i)))**2 - one))
562 dtx(i)=dtfacs*sqrt(one+dmels(i)/(two*mssa(i)))*dty(i)
563
564 END DO
565 ELSE
566 DO i=1,nel
567 sti(i) = zero
568 IF(off(i)==zero.OR.offg(i)<zero) cycle
569 IF(ipm(251,mt)/=0) cycle
570
571 IF(n2d==0) THEN
572 tidt = one/dty(i)
573 trho = rho(i) * tidt
574 tvol = vol(i) * tidt
575 sti(i) = trho * tvol
576
577
578 ELSE
579 tidt = one/dty(i)
580 trho = rho(i) * tidt
581 taire = aire(i) * tidt
582 sti(i) = half * trho * taire
583 ENDIF
584
585
586
587
588 dmels(i)=
max(dmels(i),
589 . two*mssa(i)*((dtmins/(dtfacs*dty(i)))**2 - one))
590 dtx(i)=dtfacs*sqrt(one+dmels(i)/(two*mssa(i)))*dty(i)
591 END DO
592 END IF
593
594 IF(jthe > 0)THEN
595 mt = mat(1)
596 DO i=1,nel
597 IF(off(i)==zero.OR.offg(i)<zero) cycle
598 sph = pm(69,mt)
599 ak1 = pm(75,mt)
600 bk1 = pm(76,mt)
601 ak2 = pm(77,mt)
602 bk2 = pm(78,mt)
603 tli = pm(80,mt)
604 IF(temp(i)<tli)THEN
605 akk=ak1+bk1*temp(i)
606 ELSE
607 akk=ak2+bk2*temp(i)
608 ENDIF
609 IF(jtur/=0)THEN
610 xmu = rho(i)*pm(24,mt)
611 tmu = pm(81,mt)
612 rpr = pm(95,mt)
613 atu=rpr*tmu*rk(i)*rk(i)/(
max(em15,re(i)*vol(i))*xmu)
614 akk=akk*(1.+atu)
615 ENDIF
616 dtx(i) =
min(dtx(i),dtfacs*half*deltax(i)*deltax(i)*
618 ENDDO
619 END IF
620 END IF
621
622 IF(nodadt==0 .OR. (idtmins == 2 .AND. jsms /= 0) .OR. ale_or_euler==1)THEN
623 id_min=0
624 DO i=1,nel
625 IF(dtx(i)>dt2t .OR. off(i)<=zero .OR. offg(i)<=zero) cycle
626
627 IF(vol(i)<=zero)cycle
628 dt2t = dtx(i)
629 neltst = ngl(i)
630 ityptst = ity
631 id_min = i
632 ENDDO
633 IF(dt2t<dtmin1(102).AND.id_min>0)THEN
634 tstop = tt
635 print *, "DT=",dt2t,dtmin1(102)
636#include "lockon.inc"
637 WRITE(iout,*) ' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR ALE/EULER CELL',ngl(id_min)
638 WRITE(istdo,*)' **ERROR : TIME STEP LESS OR EQUAL DTMIN FOR ALE/EULER CELL',ngl(id_min)
639#include "lockoff.inc"
640 ENDIF
641 ENDIF
642
643
644
645
646 IF (jthe < 0 .AND. glob_therm%IDT_THERM == 1)THEN
647 mt = mat(1)
648 sph = pm(69,mt)
649 ak1 = pm(75,mt)
650 bk1 = pm(76,mt)
651 ak2 = pm(77,mt)
652 bk2 = pm(78,mt)
653 tli = pm(80,mt)
654 DO i=1,nel
655 IF(temp(i)<tli)THEN
656 akk=ak1+bk1*temp(i)
657 ELSE
658 akk=ak2+bk2*temp(i)
659 ENDIF
660 IF(jtur/=0)THEN
661 xmu = rho(i)*pm(24,mt)
662 tmu = pm(81,mt)
663 rpr = pm(95,mt)
664 atu = rpr*tmu*rk(i)*rk(i)/(
max(em15,re(i)*vol(i))*xmu)
665 akk = akk*(1.+atu)
666 ENDIF
667 akk = akk * glob_therm%THEACCFACT
668 dt = glob_therm%DTFACTHERM*half*deltax(i)*deltax(i)*sph/
max(akk,em20)
669 IF(dt< glob_therm%DT_THERM.AND.off(i)>zero.AND.offg(i)>zero) glob_therm%DT_THERM = dt
670 conde(i) = four*vol(i)*akk/(deltax(i)*deltax(i))
671 conde(i) = conde(i)*off(i)
672 ENDDO
673 ENDIF
674
675
676
677
678
679 IF (g_dt>0)THEN
680 DO i=1,nel
682 ENDDO
683 ENDIF
684
685
686 RETURN
subroutine dtel(ssp, pm, geo, pid, mat, rho0, vis, deltax, aire, vol, dtx)