From 10e6d328172a0eec8fcb75f45d86ef0c4206909f Mon Sep 17 00:00:00 2001 From: matthiasfabry Date: Tue, 2 Jun 2026 00:34:53 -0400 Subject: [PATCH] rebase to Matteo's branch, add optional linear vs exponential --- star/defaults/controls.defaults | 20 +++++++++++++++----- star/private/ctrls_io.f90 | 5 ++++- star/private/turb_support.f90 | 7 ++++++- star_data/private/star_controls.inc | 1 + 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/star/defaults/controls.defaults b/star/defaults/controls.defaults index 971e71d8a..950aec433 100644 --- a/star/defaults/controls.defaults +++ b/star/defaults/controls.defaults @@ -2746,11 +2746,8 @@ ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Optional convective-turnover-time limiter for the throttle. - ! When ``.true.``, multiplies the throttle excess - ! ``(Gamma_factor - 1)`` by - ! - ! ``f_tau = 1 - exp(-dt / tau_conv)`` - ! + ! When ``.true.``, relaxes the throttle using a fraction + ! ``f_tau`` set by ``superad_reduction_turnover_limit_function``, ! where ``tau_conv = scale_height(k) / mlt_vc_old(k)`` is the ! local convective turnover time computed from the previous ! step's converged convective velocity. This reflects the @@ -2776,6 +2773,19 @@ superad_reduction_use_turnover_limit = .false. + ! superad_reduction_turnover_limit_function + ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + ! Functional form for the turnover-time relaxation fraction. Allowed + ! values are: + ! + ! - ``'exponential'``: ``f_tau = 1 - exp(-dt/tau_conv)`` + ! - ``'linear'``: ``f_tau = min(dt/tau_conv, 1)`` + + ! :: + + superad_reduction_turnover_limit_function = 'exponential' + ! superad_reduction_turnover_vc_floor_frac ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/star/private/ctrls_io.f90 b/star/private/ctrls_io.f90 index e12508ed1..507a4bd0e 100644 --- a/star/private/ctrls_io.f90 +++ b/star/private/ctrls_io.f90 @@ -136,7 +136,8 @@ module ctrls_io gradT_excess_min_center_he4, gradT_excess_max_logT, gradT_excess_min_log_tau_full_on, gradT_excess_max_log_tau_full_off, & use_superad_reduction, superad_reduction_gamma_limit, superad_reduction_gamma_limit_scale, D_mix_zero_region_top_q, & superad_reduction_gamma_inv_scale, superad_reduction_diff_grads_limit, superad_reduction_limit, & - superad_reduction_use_turnover_limit, superad_reduction_turnover_vc_floor_frac, & + superad_reduction_use_turnover_limit, superad_reduction_turnover_limit_function, & + superad_reduction_turnover_vc_floor_frac, & make_gradr_sticky_in_solver_iters, min_logT_for_make_gradr_sticky_in_solver_iters, & max_logT_for_mlt, thermohaline_coeff, thermohaline_option, mixing_length_alpha, remove_small_D_limit, & alt_scale_height_flag, Henyey_MLT_y_param, Henyey_MLT_nu_param, no_MLT_below_shock, mlt_make_surface_no_mixing, & @@ -1080,6 +1081,7 @@ subroutine store_controls(s, ierr) s% superad_reduction_diff_grads_limit = superad_reduction_diff_grads_limit s% superad_reduction_limit = superad_reduction_limit s% superad_reduction_use_turnover_limit = superad_reduction_use_turnover_limit + s% superad_reduction_turnover_limit_function = superad_reduction_turnover_limit_function s% superad_reduction_turnover_vc_floor_frac = superad_reduction_turnover_vc_floor_frac s% max_logT_for_mlt = max_logT_for_mlt @@ -2805,6 +2807,7 @@ subroutine set_controls_for_writing(s, ierr) superad_reduction_diff_grads_limit = s% superad_reduction_diff_grads_limit superad_reduction_limit = s% superad_reduction_limit superad_reduction_use_turnover_limit = s% superad_reduction_use_turnover_limit + superad_reduction_turnover_limit_function = s% superad_reduction_turnover_limit_function superad_reduction_turnover_vc_floor_frac = s% superad_reduction_turnover_vc_floor_frac max_logT_for_mlt = s% max_logT_for_mlt diff --git a/star/private/turb_support.f90 b/star/private/turb_support.f90 index 393a982e5..834d5ceec 100644 --- a/star/private/turb_support.f90 +++ b/star/private/turb_support.f90 @@ -561,7 +561,12 @@ subroutine set_superad_reduction() * s% csound_face(k) vc_old_local = max(s% mlt_vc_old(k), vc_old_floor, 1d-30) tau_conv = scale_height / vc_old_local - f_turnover = 1d0 - exp(-s% dt / tau_conv) + select case (trim(s% superad_reduction_turnover_limit_function)) + case ('linear') + f_turnover = min(s% dt / tau_conv, 1d0) + case default + f_turnover = 1d0 - exp(-s% dt / tau_conv) + end select Gamma_factor = Gamma_factor_old_local + & f_turnover * (Gamma_factor - Gamma_factor_old_local) end if diff --git a/star_data/private/star_controls.inc b/star_data/private/star_controls.inc index bd86209b1..56e8b19bd 100644 --- a/star_data/private/star_controls.inc +++ b/star_data/private/star_controls.inc @@ -307,6 +307,7 @@ superad_reduction_diff_grads_limit, & superad_reduction_limit logical :: superad_reduction_use_turnover_limit + character(len=strlen) :: superad_reduction_turnover_limit_function real(dp) :: superad_reduction_turnover_vc_floor_frac ! mixing parameters