@@ -484,24 +484,26 @@ integer function check_dX(s, skip_hard_limit, dt, &
484
484
n_mix_bdy , mix_bdy_loc , mix_bdy_q , &
485
485
dX_dt_limit_ratio , dX_div_X_dt_limit_ratio )
486
486
use num_lib, only: binary_search
487
- type (star_info), pointer :: s
488
487
logical , intent (in ) :: skip_hard_limit
489
488
integer , intent (in ) :: n_mix_bdy, mix_bdy_loc(:)
490
489
real (dp), intent (in ) :: dt
491
490
real (dp), intent (in ), pointer :: mix_bdy_q(:)
492
491
real (dp), intent (inout ) :: dX_dt_limit_ratio, dX_div_X_dt_limit_ratio
493
492
493
+ type (star_info), pointer :: s
494
494
real (dp) :: X, X_old, delta_X, delta_X_div_X, max_dX, max_dX_div_X, &
495
- bdy_dist_dm, max_dX_bdy_dist_dm, max_dX_div_X_bdy_dist_dm, cz_dist_limit
495
+ bdy_dist_dm, max_dX_bdy_dist_dm, max_dX_div_X_bdy_dist_dm, cz_dist_limit, &
496
+ D_mix_cutoff, ratio_tmp
496
497
integer :: i, j, k, cid, bdy, max_dX_j, max_dX_k, max_dX_div_X_j, max_dX_div_X_k
497
- real (dp) :: D_mix_cutoff
498
498
real (dp), dimension (max_dX_limit_ctrls) :: dX_limit, dX_hard_limit, &
499
499
dX_div_X_limit, dX_div_X_hard_limit
500
500
character (len= strlen) :: sp
501
501
502
502
include ' formats'
503
503
504
504
check_dX = keep_going
505
+ dX_dt_limit_ratio = 0d0
506
+ dX_div_X_dt_limit_ratio = 0d0
505
507
506
508
if (s% mix_factor == 0d0 .and. s% dxdt_nuc_factor == 0d0 ) return
507
509
@@ -638,34 +640,40 @@ integer function check_dX(s, skip_hard_limit, dt, &
638
640
639
641
if (dX_limit(i) > 0 ) then
640
642
dX_dt_limit_ratio = max_dX/ dX_limit(i)
641
- if (dX_dt_limit_ratio <= 1d0 ) then
642
- dX_dt_limit_ratio = 0
643
- else
644
- s% Tlim_dX_species = max_dX_j
645
- s% Tlim_dX_cell = max_dX_k
646
- write (* , ' (a30, i5, 99e20.10)' ) &
647
- ' limit dt because of large dX ' // &
648
- trim (chem_isos% name (s% chem_id(max_dX_j))) // &
649
- ' k, max, lim, m ' , &
650
- max_dX_k, max_dX, dX_limit(i), &
651
- max_dX_bdy_dist_dm/ Msun
643
+ if (ratio_tmp > dX_dt_limit_ratio) then
644
+ dX_dt_limit_ratio = ratio_tmp
645
+ if (dX_dt_limit_ratio <= 1d0 ) then
646
+ dX_dt_limit_ratio = 0
647
+ else
648
+ s% Tlim_dX_species = max_dX_j
649
+ s% Tlim_dX_cell = max_dX_k
650
+ ! write(*, '(a30, i5, 99e20.10)') &
651
+ ! ' limit dt because of large dX '// &
652
+ ! trim(chem_isos% name(s% chem_id(max_dX_j))) // &
653
+ ! ' k, max, lim, m ', &
654
+ ! max_dX_k, max_dX, dX_limit(i), &
655
+ ! max_dX_bdy_dist_dm/Msun
656
+ end if
652
657
end if
653
-
654
658
end if
655
659
656
660
if (dX_div_X_limit(i) > 0 ) then
657
- dX_div_X_dt_limit_ratio = max_dX_div_X/ dX_div_X_limit(i)
658
- if (dX_div_X_dt_limit_ratio <= 1d0 ) then
659
- dX_div_X_dt_limit_ratio = 0
660
- else
661
- s% Tlim_dX_div_X_species = max_dX_div_X_j
662
- s% Tlim_dX_div_X_cell = max_dX_div_X_k
663
- write (* , ' (a35, i5, 99e20.10)' ) &
664
- ' limit dt because of large dX_div_X ' // &
665
- trim (chem_isos% name (s% chem_id(max_dX_div_X_j))) // &
666
- ' k, max, lim, m ' , &
667
- max_dX_div_X_k, max_dX_div_X, dX_div_X_limit(i), &
668
- max_dX_div_X_bdy_dist_dm/ Msun
661
+ ratio_tmp = max_dX_div_X/ dX_div_X_limit(i)
662
+ if (ratio_tmp > dX_div_X_dt_limit_ratio) then ! pick out largest culprit only!
663
+ dX_div_X_dt_limit_ratio = ratio_tmp
664
+ if (dX_div_X_dt_limit_ratio <= 1d0 ) then
665
+ dX_div_X_dt_limit_ratio = 0
666
+ else
667
+ s% Tlim_dX_div_X_species = max_dX_div_X_j
668
+ s% Tlim_dX_div_X_cell = max_dX_div_X_k
669
+ ! write(*, '(a35, i5, 99e20.10)') & ! shouldn't be written as is isn't guarantueed
670
+ ! this control will trigger timestep reduction
671
+ ! ' limit dt because of large dX_div_X ' // &
672
+ ! trim(chem_isos% name(s% chem_id(max_dX_div_X_j))) // &
673
+ ! ' k, max, lim, m ', &
674
+ ! max_dX_div_X_k, max_dX_div_X, dX_div_X_limit(i), &
675
+ ! max_dX_div_X_bdy_dist_dm/Msun
676
+ end if
669
677
end if
670
678
end if
671
679
end do
0 commit comments