Rayonnement solaire sur Terre

Où l’on trace un spectre du rayonnement solaire incident sur Terre, en comparant le rayonnement au sol et celui hors atmosphère.

Pour obtenir ce graphique, j’ai utilisé les données disponibles sur

https://www.nrel.gov/grid/solar-resource/spectra.html

Les données utiles sont :

  • la longueur d’onde
  • l’irradiance extraterrestre (hors atmosphère
  • l’irradiance au sol

Les données sont dans un fichier Excel :

Pour une importation des données du fichier par le module Pandas, j’ouvre le fichier .xls et le convertis en fichier .csv. Voici le début du script Python (appel des modules et import des données) :

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

plt.rcParams["font.family"] = "Roboto"# ou autre police installée.

donnees = pd.read_csv("astmg173.csv",sep='\t',
                      skiprows=2,
                      usecols=[0,1,2],
                      names=['lam','flux_ET','flux_sol'])

lam=donnees['lam']# longueur d'onde (nanomètres)
flux_ET=donnees['flux_ET']
flux_sol=donnees['flux_sol']

Création du graphique :

fig = plt.figure(figsize=(29.7/2.54,21/2.54))# format A4 paysage

ax = plt.subplot(111)

ax.set_title('Rayonnement solaire sur Terre',fontsize=16)
ax.set_xlabel("longueur d'onde (nm)")
ax.set_ylabel(r"Irradiance ($W\cdot m^{-2} \cdot nm^{-1}$)")
ax.set_xticks(np.arange(200,2600,200))
ax.set_xlim(250,2600)
ax.set_ylim(0,2.5)

ax.plot(lam,flux_ET, c='indigo', lw=1,label="hors atmosphère")
ax.plot(lam,flux_sol, c='firebrick', lw=1,label="au sol")
plt.fill_between(lam, 0, flux_sol, color='goldenrod')

Cette dernière ligne remplit l’espace entre la ligne de base et le spectre du flux au sol.

Je calcule ensuite les points de la courbe avec le modèle du corps noir :

h=6.626e-34# constante de Planck
c=3.0e8# célérité de la lumière
k=1.38e-23# constante de Boltzmann
T=5770# température de surface du Soleil
f=8.5e-14#ajustement pour l'échelle (car unités différentes)

lam_m=lam*1e-9#longueur d'onde en mètres
luminance=2*h*c**2*lam_m**(-5)/(np.exp(h*c/(k*T*lam_m))-1)*f

ax.plot(lam,luminance,c='k',label=f"rayonnnement corps noir à {T} K")

Je ne sais plus où j’ai trouvé les annotations des pics d’absorption des molécules.Peut-être sur Wikipedia.

Fin du script :


leg=ax.legend()
for line in leg.get_lines():# épaissir les lignes des légendes
    line.set_linewidth(4.0)
    

# légendes manuelles
ax.text(260,0.04, r"$\mathbf{O_3}$")
ax.text(750,0.1,r"$\mathbf{O_2}$",)

for coord in [[920,0.05],[1120,0.6],[1350,0.25],[1850,0.05],[2500,0.07]]:
    ax.text(coord[0],coord[1], r"$\mathbf{H_2O}$")
    
ax.text(2000,0.15, r"$\mathbf{CO_2}$")

# limites du visible :
ax.axvline(400, ls='--', color='gray', linewidth='0.5',zorder=0)
ax.axvline(800, ls='--', color='gray', linewidth='0.5',zorder=0)
props = dict(boxstyle='round', facecolor='white', linewidth=0, pad=0.3)
ax.annotate("", xy=(400, 2.4), xytext=(800, 2.4),
             arrowprops=dict(arrowstyle="<|-|>"))
ax.text(600, 2.4, "domaine visible", fontsize=8, bbox=props,
        ha='center', va='center')


ax.text(1.01,0.0,"D. Alberto (www.astrolabe-science.fr)   "
        "Données : https://www.nrel.gov/grid/solar-resource/spectra.html"
        ,rotation=90,
        transform=ax.transAxes,fontsize=8)

fig.savefig("rayonnement_solaire_sol.png",dpi=300)
fig.savefig("rayonnement_solaire_sol.pdf")

Script complet :

Soyez le premier à commenter

Laisser un commentaire