Source code for posydon.visualization.combine_TF

"""Module for combining termination flags for visualization purposes."""


__authors__ = [
    "Simone Bavera <Simone.Bavera@unige.ch>",
    "Konstantinos Kovlakas <Konstantinos.Kovlakas@unige.ch>",
    "Emmanouil Zapartas <ezapartas@gmail.com>",
    "Matthias Kruckow <Matthias.Kruckow@unige.ch>",
]


import numpy as np

# TODO: rename the varaible, these are termination flags that indicates
# the star has reached the end of the evolution
TF1_POOL_STABLE = [
    'Primary has depleted central carbon',
    'Secondary has depleted central carbon',
    'Primary got stopped before central carbon depletion',
    'Secondary got stopped before central carbon depletion',
    'Primary enters pair-instability regime',
    'Secondary enters pair-instability regime',
    'Primary enters pulsational pair-instability regime',
    'Secondary enters pulsational pair-instability regime',
    # 'offcenter neon ignition for primary',
    # 'offcenter neon ignition for secondary',
    'envelope_mass_limit',
    'gamma_center_limit',
    # 'Reached TPAGB',
    'max_age'
    ]

TF1_POOL_UNSTABLE = [
    'overflow from L2 (D_L2) distance for q(=Macc/Mdon)>1, donor is star 1',
    'overflow from L2 (R_L2) surface for q(=Macc/Mdon)<1, donor is star 1',
    'overflow from L2 (R_L2) surface for q(=Macc/Mdon)>1, donor is star 1',
    'overflow from L2 (D_L2) distance for q(=Macc/Mdon)<1, donor is star 1',
    'overflow from L2 (R_L2) surface for q(=Macc/Mdon)<1, donor is star 2',
    'overflow from L2 (R_L2) surface for q(=Macc/Mdon)>1, donor is star 2',
    'Reached maximum mass transfer rate: 1d-1',
    'Reached maximum mass transfer rate: Exceeded photon trapping radius',
    'Both stars fill their Roche Lobe and at least one of them is off MS',
    'Terminate due to L2 overflow during case A'
    ]

TF1_POOL_INITIAL_RLO = [
    'forced_initial_RLO',
    'Terminate because of overflowing initial model',
    ]

TF1_POOL_ERROR = [
    'logQ_min_limit',
    'min_timestep_limit',
    'reach cluster timelimit',
    ]

TF2_POOL_NO_RLO = [
    'no_RLOF',
    ]

TF2_POOL_INITIAL_RLO = [
    'initial_RLOF',
    ]

TF2_POOL_UNSTABLE = [
    "L2_RLOF"
    ]

TF2_POOL_UNKNOWN = [
    'None'
    ]

TF2_POOL_CONT = [
    'contact_during_MS'
    ]
                        
TF2_POOL_A = [
    'case_A1',
    'case_A2'
    ]

TF2_POOL_AB = [
    'case_A1/B1',
    'case_A2/B2',
    'case_A1/B1/C1',
    'case_A2/B2/C2',
    'case_A1/B1/C1/BB1',
    'case_A2/B2/C2/BB2',
    'case_A1/B1/A1',
    'case_A2/B2/A2'
    ]

TF2_POOL_AC = [
    'case_A1/C1',
    'case_A2/C2'
    ]

TF2_POOL_ABB = [
    'case_A1/BB1',
    'case_A2/BB2'
    ]

TF2_POOL_B = [
    'case_B1',
    'case_B2'
    ]

TF2_POOL_C = [
    'case_C1',
    'case_C2',
    ]

TF2_POOL_BC = [
    'case_B1/C1',
    'case_B2/C2'
    ]

TF2_POOL_BB = [
    'case_A1/B1/BB1',
    'case_A2/B2/BB2',
    'case_B1/BB1',
    'case_B2/BB2',
    'case_B1/C1/BB1',
    'case_B2/C2/BB2',
    'case_BA1/BB1',
    'case_BA2/BB2',
    'case_C1/BB1',
    'case_C2/BB2',
    'case_BB1',
    'case_BB2'
    ]

TF2_POOL_BA = [
    'case_BA1',
    'case_BA2'
    ]

[docs] def combine_TF12(IC, TF2, verbose=False): """Get the combination of interpolation classion and termination flag 2.""" N = len(IC) TF12 = np.array(['unknown']*N, dtype='U25') # mask unknown cases during history TF2 TF2 = [(tf[1:] if tf.startswith("?case") else tf) for tf in TF2] for i in range(N): if IC[i] == 'initial_MT': TF12[i] = 'Initial RLOF' elif IC[i] == 'not_converged': TF12[i] = 'Not converged' elif IC[i] == 'no_MT': TF12[i] = 'no_RLOF' elif IC[i] == 'stable_MT': if '1' in TF2[i] and '2' in TF2[i]: TF12[i] = 'Reverse stable MT' elif TF2[i] in TF2_POOL_CONT: TF12[i] = 'Stable contact' elif TF2[i] in TF2_POOL_A: TF12[i] = 'Stable case A' elif TF2[i] in TF2_POOL_AB: TF12[i] = 'Stable case AB' elif TF2[i] in TF2_POOL_AC: TF12[i] = 'Stable case AC' elif TF2[i] in TF2_POOL_ABB: TF12[i] = 'Stable case ABB' elif TF2[i] in TF2_POOL_B: TF12[i] = 'Stable case B' elif TF2[i] in TF2_POOL_C: TF12[i] = 'Stable case C' elif TF2[i] in TF2_POOL_BC: TF12[i] = 'Stable case BC' elif TF2[i] in TF2_POOL_BB: TF12[i] = 'Stable case BB' elif TF2[i] in TF2_POOL_BA: TF12[i] = 'Stable case BA' elif IC[i] == 'unstable_MT': if '1' in TF2[i] and '2' in TF2[i]: TF12[i] = 'Reverse unstable MT' elif TF2[i] in TF2_POOL_CONT: TF12[i] = 'Unstable contact' elif TF2[i] in TF2_POOL_A: TF12[i] = 'Unstable case A' elif TF2[i] in TF2_POOL_AB: TF12[i] = 'Unstable case AB' elif TF2[i] in TF2_POOL_AC: TF12[i] = 'Unstable case AC' elif TF2[i] in TF2_POOL_ABB: TF12[i] = 'Unstable case ABB' elif TF2[i] in TF2_POOL_B: TF12[i] = 'Unstable case B' elif TF2[i] in TF2_POOL_C: TF12[i] = 'Unstable case C' elif TF2[i] in TF2_POOL_BB: TF12[i] = 'Unstable case BB' elif TF2[i] in TF2_POOL_BC: TF12[i] = 'Unstable case BC' elif TF2[i] in TF2_POOL_UNSTABLE: TF12[i] = "Unstable L2 RLOF" # reverse MT case elif TF2[i] in TF2_POOL_BA: TF12[i] = 'Unstable case BA' # catch if something is missing from the logic if TF12[i] == 'unknown': if verbose: print(i, IC[i], TF2[i]) return TF12