Skip to content

mors.physicalmodel

physicalmodel

Module for holding functions for calculating physical quantities for the physical rotation and activity model.

ExtendedQuantities(StarState=None, Mstar=None, Age=None, OmegaEnv=None, OmegaCore=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns extended set of physical quantities not calculated by RotationQuantities.

This is the main function to be used to get things like stellar XUV emission. The user can either input as arguments the dictionary StarState, which is returned by RotationQuantities, or the basic stellar parameters Mstar, Age, OmegaEnv, and OmegaCore (final one not necessary). If StarState is not input, this function will first call RotationQuantities to get it. Either way, the return will be the same dictionary with additional parameters added to it.

Parameters:

Name Type Description Default
StarState dict

Set of quantities already calculated by RotationQuantities().

None
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
OmegaEnv float

Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaCore float

Core rotation rate in OmegaSun (=2.67e-6 rad/s).

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
StarState dict

Set of extended quantities.

Source code in src/mors/physicalmodel.py
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
def ExtendedQuantities(StarState=None,Mstar=None,Age=None,OmegaEnv=None,OmegaCore=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns extended set of physical quantities not calculated by RotationQuantities.

    This is the main function to be used to get things like stellar XUV emission. The user can either input as arguments the
    dictionary StarState, which is returned by RotationQuantities, or the basic stellar parameters Mstar, Age, OmegaEnv, and
    OmegaCore (final one not necessary). If StarState is not input, this function will first call RotationQuantities to get it.
    Either way, the return will be the same dictionary with additional parameters added to it.

    Parameters
    ----------
    StarState : dict , optional
        Set of quantities already calculated by RotationQuantities().
    Mstar : float , optional
        Mass of star in Msun.
    Age : float , optional
        Age of star.
    OmegaEnv : float
        Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaCore : float
        Core rotation rate in OmegaSun (=2.67e-6 rad/s).
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    StarState : dict
        Set of extended quantities.

    """

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Get StarState if it was not already set
    if StarState is None:

        # Make sure required parameters were set
        if Mstar is None:
            raise Exception("argument Mstar must be set in call to function")
        if Age is None:
            raise Exception("argument Age must be set in call to function")
        if OmegaEnv is None:
            raise Exception("argument OmegaEnv must be set in call to function")
        if OmegaCore is None:
            raise Exception("argument OmegaCore must be set in call to function")

        # Get rotation quantities
        StarState = RotationQuantities(Mstar=Mstar,Age=Age,OmegaEnv=OmegaEnv,OmegaCore=OmegaCore,params=params,StarEvo=StarEvo)

    # Get Lbol in erg s^-1
    StarState['Lbol'] = StarEvo.Lbol(Mstar,Age) * const.LbolSun

    # Get effective temperature in K
    StarState['Teff'] = StarEvo.Teff(Mstar,Age)

    # Get Lx in erg s^-1, Fx in erg s^-1 cm^-2, and Rx
    StarState['Lx'] , StarState['Fx'] , StarState['Rx'] = _Xray(StarState,params=params)

    # Get Tcor in MK
    StarState['Tcor'] = _Tcor(StarState,params=params)

    # Get Leuv1 in erg s^-1, Feuv1 in erg s^-1 cm^-2, and Reuv1 (10-36 nm)
    StarState['Leuv1'] , StarState['Feuv1'] , StarState['Reuv1'] = _EUV1(StarState,params=params)

    # Get Leuv2 in erg s^-1, Feuv2 in erg s^-1 cm^-2, and Reuv2 (36-92 nm)
    StarState['Leuv2'] , StarState['Feuv2'] , StarState['Reuv2'] = _EUV2(StarState,params=params)

    # Get Leuv in erg s^-1, Feuv in erg s^-1 cm^-2, and Reuv
    StarState['Leuv'] , StarState['Feuv'] , StarState['Reuv'] = _EUV(StarState,params=params)

    # Get Lly in erg s^-1, Fly in erg s^-1 cm^-2, and Rly
    StarState['Lly'] , StarState['Fly'] , StarState['Rly'] = _Lymanalpha(StarState,params=params)

    # Get habitable zone fluxes in erg s^-1 cm^-2
    aOrbHZ2 = aOrbHZ( Mstar=StarState['Mstar'] , params=params )
    StarState['FxHZ'] = StarState['Lx'] / ( 4.0 * const.Pi * (aOrbHZ2['HZ']*const.AU)**2.0 )
    StarState['Feuv1HZ'] = StarState['Leuv1'] / ( 4.0 * const.Pi * (aOrbHZ2['HZ']*const.AU)**2.0 )
    StarState['Feuv2HZ'] = StarState['Leuv2'] / ( 4.0 * const.Pi * (aOrbHZ2['HZ']*const.AU)**2.0 )
    StarState['FeuvHZ'] = StarState['Leuv'] / ( 4.0 * const.Pi * (aOrbHZ2['HZ']*const.AU)**2.0 )
    StarState['FlyHZ'] = StarState['Lly'] / ( 4.0 * const.Pi * (aOrbHZ2['HZ']*const.AU)**2.0 )

    return StarState

Leuv(Mstar=None, Age=None, Omega=None, OmegaEnv=None, Prot=None, band=0, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns EUV luminosity in erg s^-1.

The user can supply a mass, age, and surface rotation rate for a star and it returns the EUV luminosity. By default, this will be the luminosity in the 10-92 nm band, but using the band keyword argument, the user can set specify either the 10-36 nm range with 'band=1' or the 36-92 nm range for 'band=2'. The default 10-92 nm range is set with 'band=0'. The rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
Omega float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaEnv float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
Prot float

Surface rotation period in days.

None
band float

Which wavelength band to return (=0 for 10-92 nm; =1 for 10-32 nm; =2 for 32-92 nm).

0
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
Leuv float

EUV luminosity in erg s^-1.

Source code in src/mors/physicalmodel.py
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
def Leuv(Mstar=None,Age=None,Omega=None,OmegaEnv=None,Prot=None,band=0,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns EUV luminosity in erg s^-1.

    The user can supply a mass, age, and surface rotation rate for a star and it returns the EUV luminosity.
    By default, this will be the luminosity in the 10-92 nm band, but using the band keyword argument, the
    user can set specify either the 10-36 nm range with 'band=1' or the 36-92 nm range for 'band=2'. The default
    10-92 nm range is set with 'band=0'. The rotation rate can be either the rotation velocity as a multiple
    of the solar rotation rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a
    rotation period in days using the Prot keyword argument, The user can optionally also give a parameter
    dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified
    then the defaults will be used.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    Omega : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaEnv : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    Prot : float , optional
        Surface rotation period in days.
    band : float , optional
        Which wavelength band to return (=0 for 10-92 nm; =1 for 10-32 nm; =2 for 32-92 nm).
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    Leuv : float
        EUV luminosity in erg s^-1.

    """

    # Get dictionary with all luminosities
    LxuvDict = Lxuv(Mstar=Mstar,Age=Age,Omega=Omega,OmegaEnv=OmegaEnv,Prot=Prot,params=params,StarEvo=StarEvo)

    # Return depending on the desired band
    if ( band == 0 ):
        return LxuvDict['Leuv']
    elif ( band == 1 ):
        return LxuvDict['Leuv1']
    elif ( band == 2 ):
        return LxuvDict['Leuv2']
    else:
        raise Exception("invalid band set in call to function")

    return -1

Lly(Mstar=None, Age=None, Omega=None, OmegaEnv=None, Prot=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns Ly-alpha luminosity in erg s^-1.

The user can supply a mass, age, and surface rotation rate for a star and it returns the Ly-alpha luminosity. The rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
Omega float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaEnv float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
Prot float

Surface rotation period in days.

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
Lly float

Lyman-alpha luminosity in erg s^-1.

Source code in src/mors/physicalmodel.py
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
def Lly(Mstar=None,Age=None,Omega=None,OmegaEnv=None,Prot=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns Ly-alpha luminosity in erg s^-1.

    The user can supply a mass, age, and surface rotation rate for a star and it returns the Ly-alpha luminosity. The
    rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1)
    using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword
    argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though
    this is not necessary and if these are not specified then the defaults will be used.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    Omega : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaEnv : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    Prot : float , optional
        Surface rotation period in days.
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    Lly : float
        Lyman-alpha luminosity in erg s^-1.

    """

    # Get dictionary with all luminosities
    LxuvDict = Lxuv(Mstar=Mstar,Age=Age,Omega=Omega,OmegaEnv=OmegaEnv,Prot=Prot,params=params,StarEvo=StarEvo)

    return LxuvDict['Lly']

Lx(Mstar=None, Age=None, Omega=None, OmegaEnv=None, Prot=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns X-ray luminosity in erg s^-1.

The user can supply a mass, age, and surface rotation rate for a star and it returns the X-ray luminosity. The rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
Omega float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaEnv float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
Prot float

Surface rotation period in days.

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
Lx float

X-ray luminosity in erg s^-1.

Source code in src/mors/physicalmodel.py
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
def Lx(Mstar=None,Age=None,Omega=None,OmegaEnv=None,Prot=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns X-ray luminosity in erg s^-1.

    The user can supply a mass, age, and surface rotation rate for a star and it returns the X-ray luminosity. The
    rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1)
    using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword
    argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though
    this is not necessary and if these are not specified then the defaults will be used.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    Omega : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaEnv : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    Prot : float , optional
        Surface rotation period in days.
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    Lx : float
        X-ray luminosity in erg s^-1.

    """

    # Get dictionary with all luminosities
    LxuvDict = Lxuv(Mstar=Mstar,Age=Age,Omega=Omega,OmegaEnv=OmegaEnv,Prot=Prot,params=params,StarEvo=StarEvo)

    return LxuvDict['Lx']

Lxuv(Mstar=None, Age=None, Omega=None, OmegaEnv=None, Prot=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns X-ray, EUV, and Ly-alpha luminosities in erg s^-1.

The user can supply a mass, age, and surface rotation rate for a star and it returns the XUV luminosities as a dictionary. The rotation rate can be either the rotation velocity as a multiple of the solar rotation rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using the Prot keyword argument, The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
Omega float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaEnv float

Surface rotation rate in OmegaSun (=2.67e-6 rad/s).

None
Prot float

Surface rotation period in days.

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
LxuvDict dict

Dictionary of luminosities in erg s^-1.

Source code in src/mors/physicalmodel.py
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
def Lxuv(Mstar=None,Age=None,Omega=None,OmegaEnv=None,Prot=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns X-ray, EUV, and Ly-alpha luminosities in erg s^-1.

    The user can supply a mass, age, and surface rotation rate for a star and it returns the XUV luminosities as
    a dictionary. The rotation rate can be either the rotation velocity as a multiple of the solar rotation
    rate (2.67e-6 rad s^-1) using either Omega or OmegaEnv keyword arguments, or as a rotation period in days using
    the Prot keyword argument, The user can optionally also give a parameter dictionary and an instance of the
    StarEvo class, though this is not necessary and if these are not specified then the defaults will be used.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    Omega : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaEnv : float , optional
        Surface rotation rate in OmegaSun (=2.67e-6 rad/s).
    Prot : float , optional
        Surface rotation period in days.
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    LxuvDict : dict
        Dictionary of luminosities in erg s^-1.

    """

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Make sure mass and age are specified
    if Mstar is None:
        raise Exception("Mstar must be set in call to function")
    if Age is None:
        raise Exception("Age must be set in call to function")

    # Make sure rotation is set
    if ( Omega is None ) and ( OmegaEnv is None ) and ( Prot is None ):
        raise Exception("Omega, OmegaEnv, or Prot must be set in call to function")

    # Make sure only one rotation rate is set (add up number of set parameters)
    nSet = 0
    if not Omega is None:
        nSet += 1
    if not OmegaEnv is None:
        nSet += 1
    if not Prot is None:
        nSet += 1
    if not ( nSet == 1 ):
        raise Exception("can only set one of Omega, OmegaEnv, and Prot in call to function")

    # Get Omega not set
    if not OmegaEnv is None:
        Omega = OmegaEnv
    if not Prot is None:
        Omega = _Omega(Prot)

    # The function _Xray needs Ro, Rstar, and Lbol so make a StarState dictionary with these
    StarState = {}
    StarState['OmegaEnv'] = Omega
    StarState['Rstar'] = StarEvo.Rstar(Mstar,Age)
    StarState['Prot'] = _Prot(Omega)
    StarState['tauConv'] = StarEvo.tauConv(Mstar,Age)
    StarState['Ro'] = _Ro(StarState)
    StarState['Lbol'] = StarEvo.Lbol(Mstar,Age) * const.LbolSun

    # Get X-ray
    StarState['Lx'] , StarState['Fx'] , StarState['Rx'] = _Xray(StarState,params=params)

    # Get EUV
    StarState['Leuv1'] , StarState['Feuv1'] , StarState['Reuv1'] = _EUV1(StarState,params=params)
    StarState['Leuv2'] , StarState['Feuv2'] , StarState['Reuv2'] = _EUV2(StarState,params=params)
    StarState['Leuv'] , StarState['Feuv'] , StarState['Reuv'] = _EUV(StarState,params=params)

    # Get Ly-alpha
    StarState['Lly'] , StarState['Fly'] , StarState['Rly'] = _Lymanalpha(StarState,params=params)

    # Make dictionary with luminosities
    LxuvDict = {}
    LxuvDict['Lxuv'] = StarState['Lx'] + StarState['Leuv']
    LxuvDict['Lx'] = StarState['Lx']
    LxuvDict['Leuv1'] = StarState['Leuv1']
    LxuvDict['Leuv2'] = StarState['Leuv2']
    LxuvDict['Leuv'] = StarState['Leuv']
    LxuvDict['Lly'] = StarState['Lly']

    LxuvDict['Fxuv'] = StarState['Fx'] + StarState['Feuv']
    LxuvDict['Fx'] = StarState['Fx']
    LxuvDict['Feuv1'] = StarState['Feuv1']
    LxuvDict['Feuv2'] = StarState['Feuv2']
    LxuvDict['Feuv'] = StarState['Feuv']
    LxuvDict['Fly'] = StarState['Fly']

    LxuvDict['Rxuv'] = StarState['Rx'] + StarState['Reuv']
    LxuvDict['Rx'] = StarState['Rx']
    LxuvDict['Reuv1'] = StarState['Reuv1']
    LxuvDict['Reuv2'] = StarState['Reuv2']
    LxuvDict['Reuv'] = StarState['Reuv']
    LxuvDict['Rly'] = StarState['Rly']

    return LxuvDict

MdotFactor(Mstar, Rstar, OmegaSurface, params=params.paramsDefault)

Takes stellar mass, radius, and rotation rate, returns factor to increase wind mass loss rate.

Source code in src/mors/physicalmodel.py
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
def MdotFactor(Mstar,Rstar,OmegaSurface,params=params.paramsDefault):
    """Takes stellar mass, radius, and rotation rate, returns factor to increase wind mass loss rate."""

    # Initially assume factor is unity
    factor = 1.0

    # Rotation fraction of breakup
    fracBreak = OmegaSurface / OmegaBreak(Mstar,Rstar)

    # Work out if close to break up
    if ( fracBreak > params['fracBreakThreshold'] ):

        # The equation to use should depend on the fraction of break-up that the star is at
        # basically I (C.P.Johnstone) did two fits and the better fit is the first one here
        # but this is unstable when fracBreak>1.009 so at that point, the code switches to
        # the other fit. This should not actually happen since stars should not get that
        # rapidly rotating.
        if ( fracBreak < 1.009 ):

            # For the relation below, do not allow frac larger than 1.009 since that
            # gives us NaNs
            fracBreak = min( fracBreak , 1.009 )

            # Get the factor using a better fit to the factor-frac relation based on Johnstone (2017)
            factor = 0.93 * ( 1.01 - fracBreak )**(-0.43) * np.exp( 0.31 * fracBreak**7.5 )

        else:

            #Get the multiplicative factor (ORIGINAL NOT SO GOOD EQUATION)
            factor = (5.94401988e+03) * fracBreak**7.0 + (-2.12411847e+04) * fracBreak**6.0 + (3.07933216e+04) * fracBreak**5.0 + (-2.32693067e+04) * fracBreak**4.0 + (9.80417648e+03) * fracBreak**3.0 + (-2.27923380e+03) * fracBreak**2.0 + (2.68629816e+02) * fracBreak**1.0 + (-1.13054867e+01) * fracBreak**0.0

    return factor

OmegaBreak(Mstar, Rstar)

Takes stellar mass and radius in solar units, returns breakup rotation rate in OmegaSun.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

required
Rstar float

Radius of star in Rsun.

required

Returns:

Name Type Description
OmegaBreak float

Breakup angular velocity in OmegaSun.

Source code in src/mors/physicalmodel.py
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
def OmegaBreak(Mstar,Rstar):
    """Takes stellar mass and radius in solar units, returns breakup rotation rate in OmegaSun.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Rstar : float
        Radius of star in Rsun.

    Returns
    -------
    OmegaBreak : float
        Breakup angular velocity in OmegaSun.

    """

    # Assuming here that Rpole = Rstar
    return (2.0/3.0)**(3.0/2.0) * ( const.GravConstant * Mstar*const.Msun )**0.5 / ( Rstar*const.Rsun )**(3.0/2.0) / const.OmegaSun

OmegaSat(Mstar=None, Age=None, param='XUV', params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns saturation rotation rate as surface angular velocity.

The user can supply a mass and age, and the code will return the rotation rate of the saturation threshold as a multiple of the solar rotation rate (2.67e-6 rad s^-1). The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used. The code has three activity quantities (XUV, Mdot, and Bdip) that saturate and by default it is assumed that they saturate at the same rotation rates, but there are three separate model parameters for each (RoSatBdip, RoSatMdot, RoSatXray). By default, it is assumed that the user wants the X-ray saturation threshold but this can be changed with the param keyword argument.

Parameters:

Name Type Description Default
Mstar float or ndarray

Mass of star in Msun.

None
Age float or ndarray

Age of star in Myr.

None
param str

String specifying which quantity the saturation threshold is needed for (default='XUV', options: 'XUV', 'Bdip', 'Mdot').

'XUV'
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
Omega float

Saturation rotation rate in OmegaSun.

Source code in src/mors/physicalmodel.py
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
def OmegaSat(Mstar=None,Age=None,param='XUV',params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns saturation rotation rate as surface angular velocity.

    The user can supply a mass and age, and the code will return the rotation rate of the saturation threshold
    as a multiple of the solar rotation rate (2.67e-6 rad s^-1). The user can optionally also give a parameter
    dictionary and an instance of the StarEvo class, though  this is not necessary and if these are not specified
    then the defaults will be used. The code has three activity quantities (XUV, Mdot, and Bdip) that saturate
    and by default it is assumed that they saturate at the same rotation rates, but there are three separate
    model parameters for each (RoSatBdip, RoSatMdot, RoSatXray). By default, it is assumed that the user wants
    the X-ray saturation threshold but this can be changed with the param keyword argument.

    Parameters
    ----------
    Mstar : float or np.ndarray
        Mass of star in Msun.
    Age : float or np.ndarray
        Age of star in Myr.
    param : str , optional
        String specifying which quantity the saturation threshold is needed for (default='XUV', options: 'XUV', 'Bdip', 'Mdot').
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    Omega : float
        Saturation rotation rate in OmegaSun.

    """

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Get rotation period of saturation threshold
    Prot = ProtSat(Mstar=Mstar,Age=Age,param=param,params=params,StarEvo=StarEvo)

    # Convert to rotation angular velocity in OmegaSun
    Omega = _Omega(Prot)

    return Omega

ProtSat(Mstar=None, Age=None, param='XUV', params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns saturation rotation rate as rotation period.

The user can supply a mass and age, and the code will return the rotation rate of the saturation threshold as a multiple of the solar rotation rate (2.67e-6 rad s^-1). The user can optionally also give a parameter dictionary and an instance of the StarEvo class, though this is not necessary and if these are not specified then the defaults will be used. The code has three activity quantities (XUV, Mdot, and Bdip) that saturate and by default it is assumed that they saturate at the same rotation rates, but there are three separate model parameters for each (RoSatBdip, RoSatMdot, RoSatXray). By default, it is assumed that the user wants the X-ray saturation threshold but this can be changed with the param keyword argument.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star in Myr.

None
param str

String specifying which quantity the saturation threshold is needed for (default='XUV', options: 'XUV', 'Bdip', 'Mdot').

'XUV'
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
Prot float

Saturation rotation period in days.

Source code in src/mors/physicalmodel.py
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
def ProtSat(Mstar=None,Age=None,param='XUV',params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns saturation rotation rate as rotation period.

    The user can supply a mass and age, and the code will return the rotation rate of the saturation threshold
    as a multiple of the solar rotation rate (2.67e-6 rad s^-1). The user can optionally also give a parameter
    dictionary and an instance of the StarEvo class, though  this is not necessary and if these are not specified
    then the defaults will be used. The code has three activity quantities (XUV, Mdot, and Bdip) that saturate
    and by default it is assumed that they saturate at the same rotation rates, but there are three separate
    model parameters for each (RoSatBdip, RoSatMdot, RoSatXray). By default, it is assumed that the user wants
    the X-ray saturation threshold but this can be changed with the param keyword argument.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star in Myr.
    param : str , optional
        String specifying which quantity the saturation threshold is needed for (default='XUV', options: 'XUV', 'Bdip', 'Mdot').
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    Prot : float
        Saturation rotation period in days.

    """

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Get saturation Rossby number based on user input of param
    if ( param == 'XUV' ):
        Ro = params['RoSatXray']
    elif ( param == 'Bdip' ):
        Ro = params['RoSatBdip']
    elif ( param == 'Mdot' ):
        Ro = params['RoSatMdot']
    else:
        raise Exception("invalid value of param in call to function")

    # Convective turnover time in days
    tauConv = StarEvo.tauConv(Mstar,Age)

    # Work out rotation period saturation
    Prot = Ro * tauConv

    return Prot

QuantitiesUnits(StarState=None)

Returns dictionary of units for each physical quantity in calculated by RotationQuantities() and ExtendedQuantities().

For output purposes, this is essential since it gives the user a way to know the units of the quantities output. It is recommended to input also 'StarState' which will cause the function to also check that all quantities in StarState do in fact have units and will cause the function to only return units for quantities that are included, so for instance if StarState was only calculated by RotationQuantities() and not by ExtendedQuantities(), then only units for the rotation quantities will be included.

Parameters:

Name Type Description Default
StarState dict

Set of quantities already calculated by RotationQuantities() and possibly ExtendedQuantities().

None

Returns:

Name Type Description
StarStateUnits dict

Dictionary of strings holding units for quantities.

Source code in src/mors/physicalmodel.py
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
def QuantitiesUnits(StarState=None):
    """Returns dictionary of units for each physical quantity in calculated by RotationQuantities() and ExtendedQuantities().

    For output purposes, this is essential since it gives the user a way to know the units of the quantities output. It is
    recommended to input also 'StarState' which will cause the function to also check that all quantities in StarState do
    in fact have units and will cause the function to only return units for quantities that are included, so for instance if
    StarState was only calculated by RotationQuantities() and not by ExtendedQuantities(), then only units for the rotation
    quantities will be included.

    Parameters
    ----------
    StarState : dict , optional
        Set of quantities already calculated by RotationQuantities() and possibly ExtendedQuantities().

    Returns
    -------
    StarStateUnits : dict
        Dictionary of strings holding units for quantities.

    """

    # Create empty dictionary
    StarStateUnits = {}

    # Get initial dictionary of units
    StarStateUnits['Mstar'] = 'Msun'
    StarStateUnits['dAge'] = 'Myr'
    StarStateUnits['Age'] = 'Myr'
    StarStateUnits['OmegaEnv'] = 'OmegaSun =2.67e-6 rad s^-1'
    StarStateUnits['OmegaCore'] = 'OmegaSun =2.67e-6 rad s^-1'
    StarStateUnits['Prot'] = 'days'
    StarStateUnits['Rstar'] = 'Rsun'
    StarStateUnits['tauConv'] = 'days'
    StarStateUnits['Ro'] = ''
    StarStateUnits['Itotal'] = 'g cm^2'
    StarStateUnits['Ienv'] = 'g cm^2'
    StarStateUnits['Icore'] = 'g cm^2'
    StarStateUnits['dItotaldt'] = 'g cm^2 s^-1'
    StarStateUnits['dIenvdt'] = 'g cm^2 s^-1'
    StarStateUnits['dIcoredt'] = 'g cm^2 s^-1'
    StarStateUnits['Rcore'] = 'Rsun'
    StarStateUnits['dMcoredt'] = 'g s^-1'
    StarStateUnits['Mdot'] = 'g s^-1'
    StarStateUnits['Bdip'] = 'G'
    StarStateUnits['vEsc'] = 'cm s^-1'
    StarStateUnits['torqueEnvMom'] = 'erg'
    StarStateUnits['torqueCoreMom'] = 'erg'
    StarStateUnits['torqueEnvCG'] = 'erg'
    StarStateUnits['torqueCoreCG'] = 'erg'
    StarStateUnits['torqueEnvWind'] = 'erg'
    StarStateUnits['torqueEnvCE'] = 'erg'
    StarStateUnits['torqueCoreCE'] = 'erg'
    StarStateUnits['torqueEnvDL'] = 'erg'
    StarStateUnits['torqueEnv'] = 'erg'
    StarStateUnits['dOmegaEnvdt'] = 'OmegaSun Myr^-1'
    StarStateUnits['torqueCore'] = 'erg'
    StarStateUnits['dOmegaCoredt'] = 'OmegaSun Myr^-1'
    StarStateUnits['Lbol'] = 'erg s^-1'
    StarStateUnits['Teff'] = 'K'
    StarStateUnits['Lx'] = 'erg s^-1'
    StarStateUnits['Fx'] = 'erg s^-1 cm^-2'
    StarStateUnits['Rx'] = ''
    StarStateUnits['Tcor'] = 'MK'
    StarStateUnits['Leuv1'] = 'erg s^-1'
    StarStateUnits['Feuv1'] = 'erg s^-1 cm^-2'
    StarStateUnits['Reuv1'] = ''
    StarStateUnits['Leuv2'] = 'erg s^-1'
    StarStateUnits['Feuv2'] = 'erg s^-1 cm^-2'
    StarStateUnits['Reuv2'] = ''
    StarStateUnits['Leuv'] = 'erg s^-1'
    StarStateUnits['Feuv'] = 'erg s^-1 cm^-2'
    StarStateUnits['Reuv'] = ''
    StarStateUnits['Lly'] = 'erg s^-1'
    StarStateUnits['Fly'] = 'erg s^-1 cm^-2'
    StarStateUnits['Rly'] = ''
    StarStateUnits['FxHZ'] = 'erg s^-1 cm^-2'
    StarStateUnits['Feuv1HZ'] = 'erg s^-1 cm^-2'
    StarStateUnits['Feuv2HZ'] = 'erg s^-1 cm^-2'
    StarStateUnits['FeuvHZ'] = 'erg s^-1 cm^-2'
    StarStateUnits['FlyHZ'] = 'erg s^-1 cm^-2'

    # If StarState was set in call to function then only include units for quantities in StarState and
    # make sure all quantities in StarState have units given (even if the quantity is dimensionless)
    if not StarState is None:

        # Make deep copy of StarStateUnits
        StarStateUnitsTemp = copy.deepcopy(StarStateUnits)

        # Start new StarStateUnits
        StarStateUnits = {}

        # Loop over quantities in StarState and add each one to StarStateUnits
        for quantity in StarState:

            # Make sure it is included in list of units above
            if not ( quantity in StarStateUnitsTemp ):
                raise Exception("units for "+quantity+" not included in units list")

            # Add to dictionary
            StarStateUnits[quantity] = StarStateUnitsTemp[quantity]

    return StarStateUnits

RotationQuantities(Mstar=None, Age=None, OmegaEnv=None, OmegaCore=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns rotation quantities including rates of change of rotation.

This is the main function to be used to get the rates of change of the core and envelope rotation rates given basic stellar parameters. The actual calculations of these are done in GetState() which itself also returns a very large number of other things used during the calculation of the rates of change.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
OmegaEnv float

Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaCore float

Core rotation rate in OmegaSun (=2.67e-6 rad/s).

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
StarState dict

Set of rotation quantities.

Source code in src/mors/physicalmodel.py
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
def RotationQuantities(Mstar=None,Age=None,OmegaEnv=None,OmegaCore=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns rotation quantities including rates of change of rotation.

    This is the main function to be used to get the rates of change of the core and envelope rotation
    rates given basic stellar parameters. The actual calculations of these are done in GetState() which
    itself also returns a very large number of other things used during the calculation of the rates
    of change.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    OmegaEnv : float
        Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaCore : float
        Core rotation rate in OmegaSun (=2.67e-6 rad/s).
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    StarState : dict
        Set of rotation quantities.

    """

    # Make sure parameters are set
    if Mstar is None:
        raise Exception("argument Mstar must be set in call to function")
    if Age is None:
        raise Exception("argument Age must be set in call to function")
    if OmegaEnv is None:
        raise Exception("argument OmegaEnv must be set in call to function")
    if OmegaCore is None:
        raise Exception("argument OmegaCore must be set in call to function")

    #--------------------------------------------------------

    # Setup stellar parameter dictionary
    # This will be used to hold all of the

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Start dictionary
    StarState = {}
    StarStateUnits = {}

    # Add basic input parameters
    StarState['Mstar'] = Mstar
    StarState['Age'] = Age
    StarState['OmegaEnv'] = OmegaEnv
    StarState['OmegaCore'] = OmegaCore

    # Get rotation period from surface rotation in days
    StarState['Prot'] = _Prot(OmegaEnv)

    # Radius in cm
    StarState['Rstar'] = StarEvo.Rstar(Mstar,Age)

    # Convective turnover time in days
    StarState['tauConv'] = StarEvo.tauConv(Mstar,Age)

    # Rossby number
    StarState['Ro'] = _Ro(StarState)

    # Get moments of interia in g cm^2
    StarState['Itotal'] = StarEvo.Itotal(Mstar,Age)
    StarState['Ienv'] = StarEvo.Ienv(Mstar,Age)
    StarState['Icore'] = StarEvo.Icore(Mstar,Age)

    # Rates of change of moment of inertia in g cm^2 s^-1
    StarState['dItotaldt'] = StarEvo.dItotaldt(Mstar,Age) / const.Myr
    StarState['dIenvdt'] = StarEvo.dIenvdt(Mstar,Age) / const.Myr
    StarState['dIcoredt'] = StarEvo.dIcoredt(Mstar,Age) / const.Myr

    # Rcore in cm
    StarState['Rcore'] = StarEvo.Rcore(Mstar,Age) * const.Rsun

    # dMcoredt in g s^-1
    StarState['dMcoredt'] = StarEvo.dMcoredt(Mstar,Age) * const.Msun / const.Myr

    # Mass loss rate in g s^-1
    StarState['Mdot'] = _Mdot(StarState,params=params) * const.Msunyr_

    # Get dipole field strength in G
    StarState['Bdip'] = _Bdip(StarState,params=params)

    # Get surface escape velocity in cm s^-1
    StarState['vEsc'] = _vEsc(Mstar,StarState['Rstar'])

    #--------------------------------------------------------

    # Determine if doing core-envelope decoupling
    CoreEnvelopeDecoupling = _shouldCoreEnvelopeDecoupling( StarState , params=params )

    #--------------------------------------------------------

    # Add moment of interia change torque
    if params['MomentInertiaChangeTorque']:
        StarState['torqueEnvMom'] , StarState['torqueCoreMom'] = _torqueMoment( StarState , CoreEnvelopeDecoupling )
    else:
        StarState['torqueEnvMom'] = StarState['torqueCoreMom'] = 0.0

    # Add core-growth torque
    if params['CoreGrowthTorque'] and CoreEnvelopeDecoupling:
        StarState['torqueEnvCG'] , StarState['torqueCoreCG'] = _torqueCoreGrowth( StarState )
    else:
        StarState['torqueEnvCG'] = StarState['torqueCoreCG'] = 0.0

    # Add wind spin-down torque
    if params['WindTorque']:
        StarState['torqueEnvWind'] = _torqueWind( StarState , params=params )
    else:
        StarState['torqueEnvWind'] = 0.0

    # Add wind spin-down torque
    if params['CoreEnvelopeTorque'] and CoreEnvelopeDecoupling:
        StarState['torqueEnvCE'] , StarState['torqueCoreCE'] = _torqueCoreEnvelope( StarState , params=params )
    else:
        StarState['torqueEnvCE'] = StarState['torqueCoreCE'] = 0.0

    # Add disk locking torque
    if params['DiskLocking']:
        StarState['torqueEnvDL'] = _torqueDiskLocking( StarState , CoreEnvelopeDecoupling , params=params )
    else:
        StarState['torqueEnvDL']  = 0.0

    #--------------------------------------------------------
    # Envelope rotation rate of change

    # Get total torque on envelope
    StarState['torqueEnv'] = StarState['torqueEnvMom'] + StarState['torqueEnvCG'] + StarState['torqueEnvWind'] + StarState['torqueEnvCE'] + StarState['torqueEnvDL']

    # Get rates of change of rotation in rad s^-2
    StarState['dOmegaEnvdt'] = StarState['torqueEnv'] / StarState['Ienv']

    # Get envelope rates of change in OmegaSun Myr^-1
    StarState['dOmegaEnvdt'] *= const.Myr / const.OmegaSun

    #--------------------------------------------------------
    # Core rotation rate of change

    # Have core spin-up with envelope if not developed yet
    if CoreEnvelopeDecoupling:

        # Get total torque on core
        StarState['torqueCore'] = StarState['torqueCoreMom'] + StarState['torqueCoreCG'] + StarState['torqueCoreCE']

        # Get rates of change of rotation in rad s^-2
        StarState['dOmegaCoredt'] = StarState['torqueCore'] / StarState['Icore']

        # Get envelope rates of change in OmegaSun Myr^-1
        StarState['dOmegaCoredt'] *= const.Myr / const.OmegaSun

    else:

        # There should be no torque on the core and it should spin up or down with the envelope
        StarState['torqueCore'] = 0.0
        StarState['dOmegaCoredt'] = StarState['dOmegaEnvdt']

    #--------------------------------------------------------

    return StarState

XUVScatter(XUVAverage, params=params.paramsDefault)

Takes stellar XUV values, returns scatter around these value.

The other functions in this code calculate an average XUV values for a star given its parameters, making them unique functions of mass, age, and rotation. In reality there is a scatter around these values that appear somewhat random, likely due to variability. This scatter can be described as a log normal probability density function. This function can be used to get values for the scatter for a given stellar Lx. Specifically, if LxAverage is the average mass, age, and omega dependent X-ray luminosity, the true Lx is given by LxAverage + deltaLx, and it is this deltaLx that this function calculates. This function calculates these scatter values for all XUV parameters calculated by Lxuv above

Parameters:

Name Type Description Default
XUVAverage dict

Dictionary of values returned by Lxuv().

required
params dict

Dictionary holding model parameters.

paramsDefault

Returns:

Name Type Description
deltaXUV dict

Values for deltaLx, deltaFx, etc. for all quantities calculated by Lxuv().

Source code in src/mors/physicalmodel.py
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
def XUVScatter(XUVAverage,params=params.paramsDefault):
    """Takes stellar XUV values, returns scatter around these value.

    The other functions in this code calculate an average XUV values for a star given its parameters, making them unique
    functions of mass, age, and rotation. In reality there is a scatter around these values that appear somewhat
    random, likely due to variability. This scatter can be described as a log normal probability density function.
    This function can be used to get values for the scatter for a given stellar Lx. Specifically, if LxAverage is
    the average mass, age, and omega dependent X-ray luminosity, the true Lx is given by LxAverage + deltaLx, and
    it is this deltaLx that this function calculates. This function calculates these scatter values for all XUV
    parameters calculated by Lxuv above

    Parameters
    ----------
    XUVAverage : dict
        Dictionary of values returned by Lxuv().
    params : dict , optional
        Dictionary holding model parameters.

    Returns
    -------
    deltaXUV : dict
        Values for deltaLx, deltaFx, etc. for all quantities calculated by Lxuv().

    """


    # Get random number for X-rays from normal distribution
    randXray = np.random.normal( 0.0 , params['sigmaXray'] )

    # Get random numbers for other quantities (not including composite like EUV=EUV1+EUV2)
    randEUV1 = 0.681 * randXray
    randEUV2 = 0.920 * randEUV1
    randLy = 0.375 * randXray

    # Add random to the log of the quantities to get scattered values
    LxScattered = 10.0**( np.log10(XUVAverage['Lx']) + randXray )
    Leuv1Scattered = 10.0**( np.log10(XUVAverage['Leuv1']) + randEUV1 )
    Leuv2Scattered = 10.0**( np.log10(XUVAverage['Leuv2']) + randEUV2 )
    LlyScattered = 10.0**( np.log10(XUVAverage['Lly']) + randLy )

    FxScattered = 10.0**( np.log10(XUVAverage['Fx']) + randXray )
    Feuv1Scattered = 10.0**( np.log10(XUVAverage['Feuv1']) + randEUV1 )
    Feuv2Scattered = 10.0**( np.log10(XUVAverage['Feuv2']) + randEUV2 )
    FlyScattered = 10.0**( np.log10(XUVAverage['Fly']) + randLy )

    RxScattered = 10.0**( np.log10(XUVAverage['Rx']) + randXray )
    Reuv1Scattered = 10.0**( np.log10(XUVAverage['Reuv1']) + randEUV1 )
    Reuv2Scattered = 10.0**( np.log10(XUVAverage['Reuv2']) + randEUV2 )
    RlyScattered = 10.0**( np.log10(XUVAverage['Rly']) + randLy )

    # Get scattered values for composite quantities
    LeuvScattered = Leuv1Scattered + Leuv2Scattered
    FeuvScattered = Feuv1Scattered + Feuv2Scattered
    ReuvScattered = Reuv1Scattered + Reuv2Scattered

    LxuvScattered = LxScattered + LeuvScattered
    FxuvScattered = FxScattered + FeuvScattered
    RxuvScattered = RxScattered + ReuvScattered

    # Get changes in array
    deltaXUV = {}

    deltaXUV['Lxuv'] = LxuvScattered - XUVAverage['Lxuv']
    deltaXUV['Lx'] = LxScattered - XUVAverage['Lx']
    deltaXUV['Leuv'] = LeuvScattered - XUVAverage['Leuv']
    deltaXUV['Leuv1'] = Leuv1Scattered - XUVAverage['Leuv1']
    deltaXUV['Leuv2'] = Leuv2Scattered - XUVAverage['Leuv2']
    deltaXUV['Lly'] = LlyScattered - XUVAverage['Lly']

    deltaXUV['Fxuv'] = FxuvScattered - XUVAverage['Fxuv']
    deltaXUV['Fx'] = FxScattered - XUVAverage['Fx']
    deltaXUV['Feuv'] = FeuvScattered - XUVAverage['Feuv']
    deltaXUV['Feuv1'] = Feuv1Scattered - XUVAverage['Feuv1']
    deltaXUV['Feuv2'] = Feuv2Scattered - XUVAverage['Feuv2']
    deltaXUV['Fly'] = FlyScattered - XUVAverage['Fly']

    deltaXUV['Rxuv'] = RxuvScattered - XUVAverage['Rxuv']
    deltaXUV['Rx'] = RxScattered - XUVAverage['Rx']
    deltaXUV['Reuv'] = ReuvScattered - XUVAverage['Reuv']
    deltaXUV['Reuv1'] = Reuv1Scattered - XUVAverage['Reuv1']
    deltaXUV['Reuv2'] = Reuv2Scattered - XUVAverage['Reuv2']
    deltaXUV['Rly'] = RlyScattered - XUVAverage['Rly']

    return deltaXUV

XrayScatter(XrayAverage, params=params.paramsDefault)

Takes stellar X-ray, returns X-ray scatter around this value.

The other functions in this code calculate an average Lx for a star given its parameters, making Lx a unique function of mass, age, and rotation. In reality there is a scatter around these values that appear somewhat random, likely due to variability. This scatter can be described as a log normal probability density function. This function can be used to get values for the scatter for a given stellar Lx. Specifically, if LxAverage is the average mass, age, and omega dependent X-ray luminosity, the true Lx is given by LxAverage + deltaLx, and it is this deltaLx that this function calculates. This function works equally well for inputting Rx or Fx.

Parameters:

Name Type Description Default
XrayAverage float or ndarray

Values for stellar Lx, Fx, or Rx in any units.

required
params dict

Dictionary holding model parameters.

paramsDefault

Returns:

Name Type Description
deltaXray float or ndarray

Values for stellar deltaLx, deltaFx, or deltaRx in input units.

Source code in src/mors/physicalmodel.py
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
def XrayScatter(XrayAverage,params=params.paramsDefault):
    """Takes stellar X-ray, returns X-ray scatter around this value.

    The other functions in this code calculate an average Lx for a star given its parameters, making Lx a unique
    function of mass, age, and rotation. In reality there is a scatter around these values that appear somewhat
    random, likely due to variability. This scatter can be described as a log normal probability density function.
    This function can be used to get values for the scatter for a given stellar Lx. Specifically, if LxAverage is
    the average mass, age, and omega dependent X-ray luminosity, the true Lx is given by LxAverage + deltaLx, and
    it is this deltaLx that this function calculates. This function works equally well for inputting Rx or Fx.

    Parameters
    ----------
    XrayAverage : float or numpy.ndarray
        Values for stellar Lx, Fx, or Rx in any units.
    params : dict , optional
        Dictionary holding model parameters.

    Returns
    -------
    deltaXray : float or numpy.ndarray
        Values for stellar deltaLx, deltaFx, or deltaRx in input units.

    """

    # Get number of stars
    if isinstance(XrayAverage,(float,int)):
        nStars = 1
    else:
        nStars = len(XrayAverage)

    # Get random number from normal distribution
    rand = np.random.normal( 0.0 , params['sigmaXray'] , nStars )

    # Add random to the log of the quantities to get scattered values
    XrayAverageScattered = 10.0**( np.log10(XrayAverage) + rand )

    # Get change
    deltaXray = XrayAverageScattered - XrayAverage

    return deltaXray

_Bdip(StarState, params=params.paramsDefault)

Takes state of star, returns dipole field strength.

Source code in src/mors/physicalmodel.py
962
963
964
965
966
967
968
969
970
971
def _Bdip(StarState,params=params.paramsDefault):
    """Takes state of star, returns dipole field strength."""

    # Use Rossby number to get dipole field, depending if saturated or not
    if ( StarState['Ro'] >= params['RoSatBdip'] ):
        BdipStar = params['BdipSun'] * ( StarState['Ro'] / const.RoSun )**params['aBdip']
    else:
        BdipStar = params['BdipSun'] * ( params['RoSatBdip'] / const.RoSun )**params['aBdip']

    return BdipStar

_EUV(StarState, params=params.paramsDefault)

Takes star state, returns Leuv in erg s^-1, Feuv in erg s^-1 cm^-1, and Reuv (10-92 nm).

Source code in src/mors/physicalmodel.py
803
804
805
806
807
808
809
810
811
def _EUV(StarState,params=params.paramsDefault):
    """Takes star state, returns Leuv in erg s^-1, Feuv in erg s^-1 cm^-1, and Reuv (10-92 nm)."""

    # Just add quantities
    Leuv = StarState['Leuv1'] + StarState['Leuv2']
    Feuv = StarState['Feuv1'] + StarState['Feuv2']
    Reuv = StarState['Reuv1'] + StarState['Reuv2']

    return Leuv , Feuv , Reuv

_EUV1(StarState, params=params.paramsDefault)

Takes star state, returns Leuv1 in erg s^-1, Feuv in erg s^-1 cm^-1, and Reuv (10-36 nm).

Source code in src/mors/physicalmodel.py
775
776
777
778
779
780
781
782
783
784
785
786
787
def _EUV1(StarState,params=params.paramsDefault):
    """Takes star state, returns Leuv1 in erg s^-1, Feuv in erg s^-1 cm^-1, and Reuv (10-36 nm)."""

    # Get Feuv from Fx using equation from Johnstone et al. (2020)
    Feuv1 = 10.0**( 2.04 + 0.681 * np.log10(StarState['Fx']) )

    # Get Leuv1 from this
    Leuv1 = Feuv1 * ( 4.0 * const.Pi * (StarState['Rstar']*const.Rsun)**2.0 )

    # Get Reuv1
    Reuv1 = Leuv1 / StarState['Lbol']

    return Leuv1 , Feuv1 , Reuv1

_EUV2(StarState, params=params.paramsDefault)

Takes star state, returns Leuv2 in erg s^-1, Feuv2 in erg s^-1 cm^-1, and Reuv2 (36-92 nm).

Source code in src/mors/physicalmodel.py
789
790
791
792
793
794
795
796
797
798
799
800
801
def _EUV2(StarState,params=params.paramsDefault):
    """Takes star state, returns Leuv2 in erg s^-1, Feuv2 in erg s^-1 cm^-1, and Reuv2 (36-92 nm)."""

    # Get Feuv2 from Feuv1 using equation from Johnstone et al. (2020)
    Feuv2 = 10.0**( -0.0341 + 0.92 * np.log10(StarState['Feuv1']) )

    # Get Leuv1 from this
    Leuv2 = Feuv2 * ( 4.0 * const.Pi * (StarState['Rstar']*const.Rsun)**2.0 )

    # Get Reuv2
    Reuv2 = Leuv2 / StarState['Lbol']

    return Leuv2 , Feuv2 , Reuv2

_Lymanalpha(StarState, params=params.paramsDefault)

Takes star state, returns Lly in erg s^-1, Fly in erg s^-1 cm^-1, and Rly (10-92 nm).

Source code in src/mors/physicalmodel.py
851
852
853
854
855
856
857
858
859
860
861
862
863
def _Lymanalpha(StarState,params=params.paramsDefault):
    """Takes star state, returns Lly in erg s^-1, Fly in erg s^-1 cm^-1, and Rly (10-92 nm)."""

    # Get Fly using from Fx using equation from Johnstone et al. (2020)
    Fly = 10.0**( 3.97 + 0.375 * np.log10(StarState['Fx']) )

    # Get Lly
    Lly = Fly * ( 4.0 * const.Pi * (StarState['Rstar']*const.Rsun)**2.0 )

    # Get Rly
    Rly = Lly / StarState['Lbol']

    return Lly , Fly , Rly

_Mdot(StarState, params=params.paramsDefault)

Takes state of star, returns mass loss rate.

Source code in src/mors/physicalmodel.py
973
974
975
976
977
978
979
980
981
982
983
984
985
986
def _Mdot(StarState,params=params.paramsDefault):
    """Takes state of star, returns mass loss rate."""

    # Use Rossby number to get mass loss rate
    if ( StarState['Ro'] >= params['RoSatMdot'] ):
        MdotWind = params['MdotSun'] * StarState['Rstar']**2.0 * (StarState['Ro']/const.RoSun)**params['aMdot'] * StarState['Mstar']**params['bMdot']
    else:
        MdotWind = params['MdotSun'] * StarState['Rstar']**2.0 * (params['RoSatMdot']/const.RoSun)**params['aMdot'] * StarState['Mstar']**params['bMdot']

    # Multiply Mdot by additional mutliplicative factor for rapid rotators if desired
    if params['BreakupMdotIncrease']:
        MdotWind *= MdotFactor(StarState['Mstar'],StarState['Rstar'],StarState['OmegaEnv'])

    return MdotWind

_Omega(Prot)

Takes rotation period in days, returns angular velocity in OmegaSun.

Source code in src/mors/physicalmodel.py
946
947
948
def _Omega(Prot):
    """Takes rotation period in days, returns angular velocity in OmegaSun."""
    return 2.0*const.Pi / ( Prot*const.day ) / const.OmegaSun

_Prot(Omega)

Takes angular velocity in OmegaSun, returns rotation period in days.

Source code in src/mors/physicalmodel.py
950
951
952
def _Prot(Omega):
    """Takes angular velocity in OmegaSun, returns rotation period in days."""
    return 2.0*const.Pi / ( Omega*const.OmegaSun ) / const.day

_Ro(StarState)

Takes state of star, returns Rossby number.

Source code in src/mors/physicalmodel.py
954
955
956
957
958
959
960
def _Ro(StarState):
    """Takes state of star, returns Rossby number."""

    # Get Rossby
    Ro = StarState['Prot'] / StarState['tauConv']

    return Ro

_Tcor(StarState, params=params.paramsDefault)

Takes star state, returns average coronal temperature in MK.

Source code in src/mors/physicalmodel.py
714
715
716
717
718
719
720
def _Tcor(StarState,params=params.paramsDefault):
    """Takes star state, returns average coronal temperature in MK."""

    # Get Tcor depending on Fx using equations from Johnstone & Guedel (2015)
    Tcor = 0.11 * StarState['Fx']**0.26

    return Tcor

_Xray(StarState, params=params.paramsDefault)

Takes star state, returns Lx in erg s^-1, Fx in erg s^-1 cm^-1, and Rx.

Source code in src/mors/physicalmodel.py
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
def _Xray(StarState,params=params.paramsDefault):
    """Takes star state, returns Lx in erg s^-1, Fx in erg s^-1 cm^-1, and Rx."""

    # Get Rx depending on Ro and regime
    if ( StarState['Ro'] < params['RoSatXray'] ):
        Rx = params['C1Xray'] * StarState['Ro']**params['beta1Xray']
    else:
        Rx = params['C2Xray'] * StarState['Ro']**params['beta2Xray']

    # Get Lx from that
    Lx = StarState['Lbol'] * Rx

    # Get Fx
    Fx = Lx / ( 4.0 * const.Pi * (StarState['Rstar']*const.Rsun)**2.0 )

    return Lx , Fx , Rx

_shouldCoreEnvelopeDecoupling(StarState, params=params.paramsDefault)

Takes state of star, determines if core-envelope decoupling should be used.

Source code in src/mors/physicalmodel.py
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
def _shouldCoreEnvelopeDecoupling(StarState,params=params.paramsDefault):
    """Takes state of star, determines if core-envelope decoupling should be used."""

    # For this, there are several things that need to be fulfilled:-
    #     1. The parameter CoreEnvelopeDecoupling must be set to True
    #     2. The ratio of the core to total stellar moment of inertia must be above the parameter IcoreThresholdCE
    #     3. The stellar mass must be above the parameter MstarThresholdCE

    # Test condition 1
    if not ( params['CoreEnvelopeDecoupling'] ):
        return False

    # Test condition 2
    if ( StarState['Icore']/StarState['Itotal'] < params['IcoreThresholdCE'] ):
        return False

    # Test condition 3
    if ( StarState['Mstar'] < params['MstarThresholdCE'] ):
        return False

    # If got to here, then core-envelope decoupling should happen
    return True

_torqueCoreEnvelope(StarState, params=params.paramsDefault)

Takes stellar parameters, returns core-envelope torque.

Source code in src/mors/physicalmodel.py
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
def _torqueCoreEnvelope(StarState,params=params.paramsDefault):
    """Takes stellar parameters, returns core-envelope torque."""

    # Get deltaJ
    deltaJ = StarState['Icore'] * StarState['Ienv'] / ( StarState['Icore'] + StarState['Ienv'] ) * ( StarState['OmegaCore'] - StarState['OmegaEnv'] ) * const.OmegaSun

    # Get core-envelope coupling timescale in Myr
    timeCE = params['aCoreEnvelope'] * StarState['OmegaEnv']**params['bCoreEnvelope'] * StarState['Mstar']**params['cCoreEnvelope']
    timeCE = max( timeCE , params['timeCEmin'] )

    # Convert timescale to seconds
    timeCE *= const.Myr

    # Get torques
    torqueEnvMoment = deltaJ / timeCE
    torqueCoreMoment = - torqueEnvMoment

    return ( torqueEnvMoment , torqueCoreMoment )

_torqueCoreGrowth(StarState)

Takes stellar parameters, returns core-growth torque in erg.

Source code in src/mors/physicalmodel.py
921
922
923
924
925
926
927
928
def _torqueCoreGrowth(StarState):
    """Takes stellar parameters, returns core-growth torque in erg."""

    # Get torque in erg
    torqueEnvCG = - 2.0/3.0 * StarState['Rcore']**2.0 * StarState['OmegaEnv']*const.OmegaSun * StarState['dMcoredt']
    torqueCoreCG = - torqueEnvCG

    return ( torqueEnvCG , torqueCoreCG )

_torqueDiskLocking(StarState, CoreEnvelopeDecoupling, params=params.paramsDefault)

Takes stellar parameters, returns disk-locking torque.

Source code in src/mors/physicalmodel.py
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
def _torqueDiskLocking(StarState,CoreEnvelopeDecoupling,params=params.paramsDefault):
    """Takes stellar parameters, returns disk-locking torque."""

    # As it is currently setup, this will only work if the other torques are calculated first

    # Get disk locking age
    ageDL = params['aDiskLock'] * StarState['OmegaEnv']**params['bDiskLock']
    ageDL = min( ageDL , params['ageDLmax'] )

    # Return nothing if after disk locking age
    if ( StarState['Age'] > ageDL ):
        return 0.0

    # Get torque on envelope
    if ( CoreEnvelopeDecoupling ):
        torqueEnvDL = - ( StarState['torqueEnvWind'] + StarState['torqueEnvCE'] + StarState['torqueEnvCG'] + StarState['torqueEnvMom'] )
    else:
        torqueEnvDL = - ( StarState['torqueEnvWind'] + StarState['torqueEnvMom'] )

    return torqueEnvDL

_torqueMoment(StarState, CoreEnvelopeDecoupling)

Takes stellar parameters, returns moment of inertia change torque in erg.

Source code in src/mors/physicalmodel.py
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
def _torqueMoment(StarState,CoreEnvelopeDecoupling):
    """Takes stellar parameters, returns moment of inertia change torque in erg."""

    # Note that the torque calculated in this function is not actually a real physical torque
    # but it is convenient to write it in the equations and in the code as if it was.

    # Get torque in erg depending on if core-envelope decoupling is being done
    if ( CoreEnvelopeDecoupling ):
        torqueEnvMoment = - StarState['dIenvdt'] * StarState['OmegaEnv']*const.OmegaSun
        torqueCoreMoment = - StarState['dIcoredt'] * StarState['OmegaCore']*const.OmegaSun
    else:
        torqueEnvMoment = - StarState['dItotaldt'] * StarState['OmegaEnv']*const.OmegaSun
        torqueCoreMoment = 0.0

    return ( torqueEnvMoment , torqueCoreMoment )

_torqueWind(StarState, params=params.paramsDefault)

Take stellar parameters, returns wind torque in erg.

Source code in src/mors/physicalmodel.py
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
def _torqueWind(StarState,params=params.paramsDefault):
    """Take stellar parameters, returns wind torque in erg."""

    # Some constants from Matt et al. (2012)
    K1Matt = 1.3
    K2Matt = 0.0506
    mMatt = 0.2177

    # Calculate torque
    torqueWind = K1Matt**2.0 * StarState['Bdip']**(4.0*mMatt) * StarState['Mdot']**(1.0-2.0*mMatt) * (StarState['Rstar']*const.Rsun)**(4.0*mMatt+2.0) * StarState['OmegaEnv'] * const.OmegaSun / ( K2Matt**2.0 * StarState['vEsc']**2.0 + (StarState['OmegaEnv']*const.OmegaSun)**2.0 * (StarState['Rstar']*const.Rsun)**2.0 )**mMatt

    # Multiply by extra factor and make negitive so it is a spin-down torque
    torqueWind = - params['Kwind'] * torqueWind

    return torqueWind

_vEsc(Mstar, Rstar)

Takes stellar mass and radius in solar units, returns surface escape velocity in cm s^-1.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

required
Rstar float

Radius of star in Rsun.

required

Returns:

Name Type Description
vEsc float

Surface escape velocity in cm s^-1.

Source code in src/mors/physicalmodel.py
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
def _vEsc(Mstar,Rstar):
    """Takes stellar mass and radius in solar units, returns surface escape velocity in cm s^-1.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Rstar : float
        Radius of star in Rsun.

    Returns
    -------
    vEsc : float
        Surface escape velocity in cm s^-1.

    """

    return ( 2.0 * const.GravConstant * Mstar*const.Msun / (Rstar*const.Rsun) )**0.5

aOrbHZ(Mstar=None, Age=None, params=params.paramsDefault)

Takes stellar mass, returns orbital distances of habitable zone boundaries.

This function can be used to get the habitable zone boundary orbital distances as a function of stellar mass and age. The mass can be either a simple value or an array, in which case all HZ boundaries will be returned as arrays. The age does not need to be set and by default the value of the AgeHZ parameter (default 5000 Myr) will be used. The habitable zone boundaries are calculated using the formulae of Kopparapu et al. (2013) and the luminosities and effective temperatures from the stellar models of Spada et al. (2013). The dictionary that is returned contains the following elements: 'RecentVenus', 'RunawayGreenhouse', 'MoistGreenhouse', 'MaximumGreenhouse', 'EarlyMars', and 'HZ'. While the first five are obvious and correspond to the boundaries in Kopparapu et al. (2013), the final one is defined in Johnstone et al. (2020) as the average of the runaway greenhouse and moist greenhouse orbital distances. All are calculated in AU.

Parameters:

Name Type Description Default
Mstar float or ndarray

Stellar mass in Msun.

None
Age float

Age to get stellar parameters in Myr (default = 5000 Myr).

None
params dict

Dictionary holding model parameters.

paramsDefault

Returns:

Name Type Description
aOrbHZAll dict

Values of HZ boundary orbital distances in AU.

Source code in src/mors/physicalmodel.py
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
def aOrbHZ(Mstar=None,Age=None,params=params.paramsDefault):
    """Takes stellar mass, returns orbital distances of habitable zone boundaries.

    This function can be used to get the habitable zone boundary orbital distances as a function of stellar mass
    and age. The mass can be either a simple value or an array, in which case all HZ boundaries will be returned
    as arrays. The age does not need to be set and by default the value of the AgeHZ parameter (default 5000 Myr)
    will be used. The habitable zone boundaries are calculated using the formulae of Kopparapu et al. (2013) and
    the luminosities and effective temperatures from the stellar models of Spada et al. (2013). The dictionary that
    is returned contains the following elements: 'RecentVenus', 'RunawayGreenhouse', 'MoistGreenhouse',
    'MaximumGreenhouse', 'EarlyMars', and 'HZ'. While the first five are obvious and correspond to the boundaries
    in Kopparapu et al. (2013), the final one is defined in Johnstone et al. (2020) as the average of the runaway
    greenhouse and moist greenhouse orbital distances. All are calculated in AU.

    Parameters
    ----------
    Mstar : float or np.ndarray
        Stellar mass in Msun.
    Age : float , optional
        Age to get stellar parameters in Myr (default = 5000 Myr).
    params : dict , optional
        Dictionary holding model parameters.

    Returns
    -------
    aOrbHZAll : dict
        Values of HZ boundary orbital distances in AU.
    """

    # Make sure Mstar is set
    if Mstar is None:
        raise Exception("Mstar must be set in call to function")

    # If Age is not set, get value from params
    if Age is None:
        Age = params['AgeHZ']

    # Start dictionary
    aOrbHZAll = {}

    # Set effective temperatures and luminosities of stars
    Lbol = SE.Lbol( Mstar , Age )
    Teff = SE.Teff( Mstar , Age )

    # Converf Teff to Tstar
    Teff += -5780.0

    # Get Recent Venus limit
    SeffSun = 1.7763
    a = 1.4335e-4
    b = 3.3954e-9
    c = -7.6364e-12
    d = -1.1950e-15
    Seff = SeffSun + a*Teff + b*Teff**2.0 + c*Teff*3.0 + d*Teff**4.0
    aOrbHZAll['RecentVenus'] = ( Lbol / Seff )**0.5

    # Get Runaway Greenhouse limit
    SeffSun = 1.0385
    a = 1.2456e-4
    b = 1.4612e-8
    c = -7.6345e-12
    d = -1.7511e-15
    Seff = SeffSun + a*Teff + b*Teff**2.0 + c*Teff*3.0 + d*Teff**4.0
    aOrbHZAll['RunawayGreenhouse'] = ( Lbol / Seff )**0.5

    # Get Moist Greenhouse limit
    SeffSun = 1.0146
    a = 8.1884e-5
    b = 1.9394e-9
    c = -4.3618e-12
    d = -6.8260e-16
    Seff = SeffSun + a*Teff + b*Teff**2.0 + c*Teff*3.0 + d*Teff**4.0
    aOrbHZAll['MoistGreenhouse'] = ( Lbol / Seff )**0.5

    # Get Maximum Greenhouse limit
    SeffSun = 0.3507
    a = 5.9578e-5
    b = 1.6707e-9
    c = -3.0058e-12
    d = -5.1925e-16
    Seff = SeffSun + a*Teff + b*Teff**2.0 + c*Teff*3.0 + d*Teff**4.0
    aOrbHZAll['MaximumGreenhouse'] = ( Lbol / Seff )**0.5

    # Get Early Mars limit
    SeffSun = 0.3207
    a = 5.4471e-5
    b = 1.5275e-9
    c = -2.1709e-12
    d = -3.8282e-16
    Seff = SeffSun + a*Teff + b*Teff**2.0 + c*Teff*3.0 + d*Teff**4.0
    aOrbHZAll['EarlyMars'] = ( Lbol / Seff )**0.5

    # Now get value of center of moist and maximum greenhouse
    aOrbHZAll['HZ'] = 0.5 * ( aOrbHZAll['MoistGreenhouse'] + aOrbHZAll['MaximumGreenhouse'] )

    return aOrbHZAll

dOmegadt(Mstar=None, Age=None, OmegaEnv=None, OmegaCore=None, params=params.paramsDefault, StarEvo=None)

Takes basic stellar parameters, returns rates of change of rotation.

This is the main function to be used by the solvers to get the rates of change of the core and envelope rotation rates given basic stellar parameters. The actual calculations of these are done in RotationQuantities() which itself also returns a very large number of other things used during the calculation of the rates of change.

Parameters:

Name Type Description Default
Mstar float

Mass of star in Msun.

None
Age float

Age of star.

None
OmegaEnv float

Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).

None
OmegaCore float

Core rotation rate in OmegaSun (=2.67e-6 rad/s).

None
params dict

Dictionary holding model parameters.

paramsDefault
StarEvo StarEvo

Instance of StarEvo class holding stellar evolution model data.

None

Returns:

Name Type Description
dOmegaEnvdt float

Rate of change of envelope rotation rate in OmegaSun Myr^-1.

dOmegaCoredt float

Rate of change of core rotation rate in OmegaSun Myr^-1.

Source code in src/mors/physicalmodel.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def dOmegadt(Mstar=None,Age=None,OmegaEnv=None,OmegaCore=None,params=params.paramsDefault,StarEvo=None):
    """Takes basic stellar parameters, returns rates of change of rotation.

    This is the main function to be used by the solvers to get the rates of change of the core and envelope
    rotation rates given basic stellar parameters. The actual calculations of these are done in RotationQuantities()
    which itself also returns a very large number of other things used during the calculation of the rates
    of change.

    Parameters
    ----------
    Mstar : float
        Mass of star in Msun.
    Age : float
        Age of star.
    OmegaEnv : float
        Envelope rotation rate in OmegaSun (=2.67e-6 rad/s).
    OmegaCore : float
        Core rotation rate in OmegaSun (=2.67e-6 rad/s).
    params : dict , optional
        Dictionary holding model parameters.
    StarEvo : mors.stellarevo.StarEvo , optional
        Instance of StarEvo class holding stellar evolution model data.

    Returns
    -------
    dOmegaEnvdt : float
        Rate of change of envelope rotation rate in OmegaSun Myr^-1.
    dOmegaCoredt : float
        Rate of change of core rotation rate in OmegaSun Myr^-1.

    """

    # Make sure parameters are set
    if Mstar is None:
        raise Exception("argument Mstar must be set in call to function")
    if Age is None:
        raise Exception("argument Age must be set in call to function")
    if OmegaEnv is None:
        raise Exception("argument OmegaEnv must be set in call to function")
    if OmegaCore is None:
        raise Exception("argument OmegaCore must be set in call to function")

    # If an instance of the StarEvo class is not input, load it with defaults
    if StarEvo is None:
        StarEvo = SE.StarEvo()

    # Get state of system
    StarState = RotationQuantities(Mstar=Mstar,Age=Age,OmegaEnv=OmegaEnv,OmegaCore=OmegaCore,params=params,StarEvo=StarEvo)

    return ( StarState['dOmegaEnvdt'] , StarState['dOmegaCoredt'] )