Plot the lightcurve of a flaring star with spots#

This example plots the lightcurve caused by a flaring star when it also has spots.

from astropy import units as u
import matplotlib.pyplot as plt
from pathlib import Path
import numpy as np
import pypsg

from VSPEC import ObservationModel,PhaseAnalyzer
from VSPEC import params
from VSPEC import config
from VSPEC.params.gcm import vspec_to_pygcm

SEED = 42
pypsg.docker.set_url_and_run()
Saved settings to /home/ted/.pypsg/settings.json
Reloading settings...

Initialize the VSPEC run parameters#

For this example, we will create the parameter objects explicitly. This can also be done using a YAML file.

header = params.Header(
    data_path=Path('.vspec/flare_spot_lightcurve'),
    teff_min=2900*u.K,
    teff_max=3400*u.K,
    seed=SEED,verbose=1
)

star = params.StarParameters(
    psg_star_template='M',
    teff=3300*u.K,
    mass = 0.1*u.M_sun,
    radius=0.15*u.R_sun,
    period = 6*u.day,
    misalignment_dir=0*u.deg,
    misalignment=0*u.deg,
    ld = params.LimbDarkeningParameters.solar(),
    faculae=params.FaculaParameters.none(),
    spots=params.SpotParameters(
        distribution='iso',
        initial_coverage=0.1,
        area_mean=300*config.MSH,
        area_logsigma=0.2,
        teff_umbra=2900*u.K,
        teff_penumbra=3000*u.K,
        equillibrium_coverage=0.1,
        burn_in=0*u.day,
        growth_rate=0/u.day,
        decay_rate=0*config.MSH/u.day,
        initial_area=10*config.MSH
        ),
    flares=params.FlareParameters(
        dist_teff_mean=9000*u.K,
        dist_teff_sigma=500*u.K,
        dist_fwhm_mean=3*u.hr,
        dist_fwhm_logsigma=0.4,
        alpha=-0.829,
        beta=26.87,
        min_energy=1e32*u.erg,
        cluster_size=3
    ),
    granulation=params.GranulationParameters.none(),
    grid_params=(500, 1000),
    spectral_grid='default'
)

planet = params.PlanetParameters.std(init_phase=180*u.deg,init_substellar_lon=0*u.deg)
system = params.SystemParameters(
    distance=1.3*u.pc,
    inclination=80*u.deg,
    phase_of_periasteron=0*u.deg
)
observation = params.ObservationParameters(
    observation_time=10*u.day,
    integration_time=4*u.hr
)
psg_params = params.psgParameters(
    gcm_binning=200,
    phase_binning=1,
    use_molecular_signatures=True,
    nmax=0,
    lmax=0,
    continuum=['Rayleigh', 'Refraction', 'CIA_all'],
)
instrument = params.InstrumentParameters.mirecle()

def gcm_getter():
    return vspec_to_pygcm(
        shape=(30,30,30),
        epsilon=7,
        star_teff=3800*u.K,
        r_star=0.2*u.R_sun,
        r_orbit=0.05*u.AU,
        lat_redistribution=0.0,
        p_surf=1*u.bar,
        p_stop=1e-5*u.bar,
        wind_u=0*u.km/u.s,
        wind_v=0*u.km/u.s,
        albedo=0.3,
        emissivity=1.0,
        gamma=1.4,
        molecules={'CO2':1e-4}
    )
gcm = params.gcmParameters(
    gcm_getter=gcm_getter,
    mean_molec_weight=28,
    gcmtype='vspec',
    is_static=True
)
parameters = params.InternalParameters(
    header = header,
    star = star,
    planet = planet,
    system = system,
    obs=observation,
    psg = psg_params,
    inst=instrument,
    gcm = gcm
)

Run the simulation#

model = ObservationModel(params=parameters)
model.build_planet()
model.build_spectra()
Starting at phase 180.0 deg, observe for 10.0 d in 60 steps
Phases = [180. 186. 192. 198. 204. 210. 216. 222. 228. 234. 240. 246. 252. 258.
 264. 270. 276. 282. 288. 294. 300. 306. 312. 318. 324. 330. 336. 342.
 348. 354.   0.   6.  12.  18.  24.  30.  36.  42.  48.  54.  60.  66.
  72.  78.  84.  90.  96. 102. 108. 114. 120. 126. 132. 138. 144. 150.
 156. 162. 168. 174. 180.] deg

Build Planet:   0%|          | 0/60 [00:00<?, ?it/s]
Build Planet:   2%|▏         | 1/60 [00:00<00:13,  4.44it/s]
Build Planet:   3%|▎         | 2/60 [00:00<00:12,  4.63it/s]
Build Planet:   5%|▌         | 3/60 [00:00<00:11,  4.86it/s]
Build Planet:   7%|▋         | 4/60 [00:00<00:11,  4.88it/s]
Build Planet:   8%|▊         | 5/60 [00:01<00:11,  4.99it/s]
Build Planet:  10%|█         | 6/60 [00:01<00:10,  5.10it/s]
Build Planet:  12%|█▏        | 7/60 [00:01<00:10,  5.12it/s]
Build Planet:  13%|█▎        | 8/60 [00:01<00:10,  4.92it/s]
Build Planet:  15%|█▌        | 9/60 [00:01<00:11,  4.63it/s]
Build Planet:  17%|█▋        | 10/60 [00:02<00:11,  4.38it/s]
Build Planet:  18%|█▊        | 11/60 [00:02<00:11,  4.20it/s]
Build Planet:  20%|██        | 12/60 [00:02<00:11,  4.33it/s]
Build Planet:  22%|██▏       | 13/60 [00:02<00:10,  4.46it/s]
Build Planet:  23%|██▎       | 14/60 [00:03<00:10,  4.25it/s]
Build Planet:  25%|██▌       | 15/60 [00:03<00:10,  4.36it/s]
Build Planet:  27%|██▋       | 16/60 [00:03<00:10,  4.05it/s]
Build Planet:  28%|██▊       | 17/60 [00:03<00:10,  3.93it/s]
Build Planet:  30%|███       | 18/60 [00:04<00:10,  3.98it/s]
Build Planet:  32%|███▏      | 19/60 [00:04<00:09,  4.16it/s]
Build Planet:  33%|███▎      | 20/60 [00:04<00:09,  4.33it/s]
Build Planet:  35%|███▌      | 21/60 [00:04<00:08,  4.47it/s]
Build Planet:  37%|███▋      | 22/60 [00:04<00:08,  4.39it/s]
Build Planet:  38%|███▊      | 23/60 [00:05<00:08,  4.47it/s]
Build Planet:  40%|████      | 24/60 [00:05<00:08,  4.42it/s]
Build Planet:  42%|████▏     | 25/60 [00:05<00:07,  4.45it/s]
Build Planet:  43%|████▎     | 26/60 [00:05<00:07,  4.46it/s]
Build Planet:  45%|████▌     | 27/60 [00:06<00:07,  4.32it/s]
Build Planet:  47%|████▋     | 28/60 [00:06<00:07,  4.20it/s]
Build Planet:  48%|████▊     | 29/60 [00:06<00:07,  3.98it/s]
Build Planet:  50%|█████     | 30/60 [00:06<00:07,  4.07it/s]
Build Planet:  52%|█████▏    | 31/60 [00:07<00:07,  4.13it/s]
Build Planet:  53%|█████▎    | 32/60 [00:07<00:06,  4.30it/s]
Build Planet:  55%|█████▌    | 33/60 [00:07<00:06,  4.40it/s]
Build Planet:  57%|█████▋    | 34/60 [00:07<00:05,  4.43it/s]
Build Planet:  58%|█████▊    | 35/60 [00:07<00:05,  4.47it/s]
Build Planet:  60%|██████    | 36/60 [00:08<00:05,  4.55it/s]
Build Planet:  62%|██████▏   | 37/60 [00:08<00:05,  4.56it/s]
Build Planet:  63%|██████▎   | 38/60 [00:08<00:04,  4.55it/s]
Build Planet:  65%|██████▌   | 39/60 [00:08<00:04,  4.53it/s]
Build Planet:  67%|██████▋   | 40/60 [00:09<00:04,  4.58it/s]
Build Planet:  68%|██████▊   | 41/60 [00:09<00:04,  4.56it/s]
Build Planet:  70%|███████   | 42/60 [00:09<00:04,  4.48it/s]
Build Planet:  72%|███████▏  | 43/60 [00:09<00:03,  4.54it/s]
Build Planet:  73%|███████▎  | 44/60 [00:09<00:03,  4.45it/s]
Build Planet:  75%|███████▌  | 45/60 [00:10<00:03,  4.42it/s]
Build Planet:  77%|███████▋  | 46/60 [00:10<00:03,  4.42it/s]
Build Planet:  78%|███████▊  | 47/60 [00:10<00:02,  4.45it/s]
Build Planet:  80%|████████  | 48/60 [00:10<00:02,  4.46it/s]
Build Planet:  82%|████████▏ | 49/60 [00:11<00:02,  4.29it/s]
Build Planet:  83%|████████▎ | 50/60 [00:11<00:02,  4.38it/s]
Build Planet:  85%|████████▌ | 51/60 [00:11<00:02,  4.44it/s]
Build Planet:  87%|████████▋ | 52/60 [00:11<00:01,  4.49it/s]
Build Planet:  88%|████████▊ | 53/60 [00:11<00:01,  4.43it/s]
Build Planet:  90%|█████████ | 54/60 [00:12<00:01,  4.37it/s]
Build Planet:  92%|█████████▏| 55/60 [00:12<00:01,  4.37it/s]
Build Planet:  93%|█████████▎| 56/60 [00:12<00:00,  4.36it/s]
Build Planet:  95%|█████████▌| 57/60 [00:12<00:00,  4.28it/s]
Build Planet:  97%|█████████▋| 58/60 [00:13<00:00,  4.29it/s]
Build Planet:  98%|█████████▊| 59/60 [00:13<00:00,  4.20it/s]
Build Planet: 100%|██████████| 60/60 [00:13<00:00,  4.29it/s]
Build Planet: 61it [00:13,  4.28it/s]
Build Planet: 61it [00:13,  4.40it/s]
Generated 29 mature spots

Build Spectra:   0%|          | 0/60 [00:00<?, ?it/s]

Loading Spectra:   0%|          | 0/6 [00:00<?, ?it/s]

Loading Spectra:  17%|█▋        | 1/6 [00:00<00:01,  2.94it/s]

Loading Spectra:  33%|███▎      | 2/6 [00:00<00:01,  2.67it/s]

Loading Spectra:  50%|█████     | 3/6 [00:01<00:01,  2.51it/s]

Loading Spectra:  67%|██████▋   | 4/6 [00:01<00:00,  2.64it/s]

Loading Spectra:  83%|████████▎ | 5/6 [00:01<00:00,  2.75it/s]

Loading Spectra: 100%|██████████| 6/6 [00:02<00:00,  2.91it/s]
Loading Spectra: 100%|██████████| 6/6 [00:02<00:00,  2.79it/s]

Build Spectra:   2%|▏         | 1/60 [00:13<13:00, 13.22s/it]
Build Spectra:   3%|▎         | 2/60 [00:13<05:29,  5.68s/it]
Build Spectra:   5%|▌         | 3/60 [00:14<03:07,  3.28s/it]
Build Spectra:   7%|▋         | 4/60 [00:14<01:59,  2.14s/it]
Build Spectra:   8%|▊         | 5/60 [00:14<01:23,  1.51s/it]
Build Spectra:  10%|█         | 6/60 [00:15<01:01,  1.14s/it]
Build Spectra:  12%|█▏        | 7/60 [00:15<00:47,  1.12it/s]
Build Spectra:  13%|█▎        | 8/60 [00:16<00:38,  1.37it/s]
Build Spectra:  15%|█▌        | 9/60 [00:16<00:31,  1.61it/s]
Build Spectra:  17%|█▋        | 10/60 [00:16<00:27,  1.82it/s]
Build Spectra:  18%|█▊        | 11/60 [00:17<00:24,  2.01it/s]
Build Spectra:  20%|██        | 12/60 [00:17<00:22,  2.18it/s]
Build Spectra:  22%|██▏       | 13/60 [00:18<00:22,  2.12it/s]
Build Spectra:  23%|██▎       | 14/60 [00:18<00:22,  2.08it/s]
Build Spectra:  25%|██▌       | 15/60 [00:19<00:21,  2.08it/s]
Build Spectra:  27%|██▋       | 16/60 [00:19<00:20,  2.12it/s]
Build Spectra:  28%|██▊       | 17/60 [00:19<00:20,  2.14it/s]
Build Spectra:  30%|███       | 18/60 [00:20<00:18,  2.25it/s]
Build Spectra:  32%|███▏      | 19/60 [00:20<00:18,  2.27it/s]
Build Spectra:  33%|███▎      | 20/60 [00:21<00:17,  2.29it/s]
Build Spectra:  35%|███▌      | 21/60 [00:21<00:16,  2.37it/s]
Build Spectra:  37%|███▋      | 22/60 [00:21<00:15,  2.42it/s]
Build Spectra:  38%|███▊      | 23/60 [00:22<00:14,  2.50it/s]
Build Spectra:  40%|████      | 24/60 [00:22<00:14,  2.57it/s]
Build Spectra:  42%|████▏     | 25/60 [00:23<00:13,  2.62it/s]
Build Spectra:  43%|████▎     | 26/60 [00:23<00:12,  2.66it/s]
Build Spectra:  45%|████▌     | 27/60 [00:23<00:12,  2.67it/s]
Build Spectra:  47%|████▋     | 28/60 [00:24<00:11,  2.70it/s]
Build Spectra:  48%|████▊     | 29/60 [00:24<00:11,  2.72it/s]
Build Spectra:  50%|█████     | 30/60 [00:24<00:11,  2.73it/s]
Build Spectra:  52%|█████▏    | 31/60 [00:25<00:10,  2.73it/s]
Build Spectra:  53%|█████▎    | 32/60 [00:25<00:10,  2.64it/s]
Build Spectra:  55%|█████▌    | 33/60 [00:26<00:10,  2.50it/s]
Build Spectra:  57%|█████▋    | 34/60 [00:26<00:10,  2.49it/s]
Build Spectra:  58%|█████▊    | 35/60 [00:26<00:09,  2.54it/s]
Build Spectra:  60%|██████    | 36/60 [00:27<00:09,  2.60it/s]
Build Spectra:  62%|██████▏   | 37/60 [00:27<00:08,  2.65it/s]
Build Spectra:  63%|██████▎   | 38/60 [00:28<00:08,  2.60it/s]
Build Spectra:  65%|██████▌   | 39/60 [00:28<00:08,  2.56it/s]
Build Spectra:  67%|██████▋   | 40/60 [00:28<00:07,  2.56it/s]
Build Spectra:  68%|██████▊   | 41/60 [00:29<00:07,  2.62it/s]
Build Spectra:  70%|███████   | 42/60 [00:29<00:06,  2.68it/s]
Build Spectra:  72%|███████▏  | 43/60 [00:29<00:06,  2.70it/s]
Build Spectra:  73%|███████▎  | 44/60 [00:30<00:05,  2.72it/s]
Build Spectra:  75%|███████▌  | 45/60 [00:30<00:05,  2.75it/s]
Build Spectra:  77%|███████▋  | 46/60 [00:30<00:05,  2.76it/s]
Build Spectra:  78%|███████▊  | 47/60 [00:31<00:04,  2.78it/s]
Build Spectra:  80%|████████  | 48/60 [00:31<00:04,  2.54it/s]
Build Spectra:  82%|████████▏ | 49/60 [00:32<00:04,  2.39it/s]
Build Spectra:  83%|████████▎ | 50/60 [00:32<00:04,  2.37it/s]
Build Spectra:  85%|████████▌ | 51/60 [00:33<00:03,  2.32it/s]
Build Spectra:  87%|████████▋ | 52/60 [00:33<00:03,  2.29it/s]
Build Spectra:  88%|████████▊ | 53/60 [00:34<00:03,  2.26it/s]
Build Spectra:  90%|█████████ | 54/60 [00:34<00:02,  2.29it/s]
Build Spectra:  92%|█████████▏| 55/60 [00:34<00:02,  2.38it/s]
Build Spectra:  93%|█████████▎| 56/60 [00:35<00:01,  2.50it/s]
Build Spectra:  95%|█████████▌| 57/60 [00:35<00:01,  2.51it/s]
Build Spectra:  97%|█████████▋| 58/60 [00:35<00:00,  2.59it/s]
Build Spectra:  98%|█████████▊| 59/60 [00:36<00:00,  2.64it/s]
Build Spectra: 100%|██████████| 60/60 [00:36<00:00,  2.69it/s]
Build Spectra: 100%|██████████| 60/60 [00:36<00:00,  1.64it/s]

Load in the data#

We can use VSPEC to read in the synthetic data we just created.

data = PhaseAnalyzer(model.directories['all_model'])

Make the figure#

time = (data.time - data.time[0]).to_value(u.day)
wl = data.wavelength.to_value(u.um)

emission = (data.thermal/data.total).to_value(u.dimensionless_unscaled)*1e6

variation = (data.star/data.star[:,0,np.newaxis]-1).to_value(u.dimensionless_unscaled)*100

fig,ax = plt.subplots(1,2,figsize=(8,4))

im=ax[0].pcolormesh(time,wl,emission,cmap='cividis')
fig.colorbar(im,ax=ax[0],label='Planet Thermal Emission (ppm)',location='top')
# ax[0].set_title('Planet')

im=ax[1].pcolormesh(time,wl,variation,cmap='cividis')
fig.colorbar(im,ax=ax[1],label='Stellar Variation (%)',location='top')
# ax[1].set_title('Star')

ax[0].set_ylabel('Wavelength (${\\rm \\mu m}$)')
fig.text(0.5,0.02,'Time (days)',ha='center')
plot flare spot lightcurve
Text(0.5, 0.02, 'Time (days)')

Total running time of the script: (0 minutes 55.906 seconds)

Gallery generated by Sphinx-Gallery