# Code for computing solar irradiance according to Solomon and Qian 2005.
# Reference: Solomon, S. C. and Qian, L. (2005) Solar extreme-ultraviolet irradiance for general circulation models,
# Journal of Geophysical Research: Space Physics, 110, A10, 10.1029/2005JA011160
#-----------------------------------------------------------------------------------------------------------------------
# Top-level imports:
import numpy as np
#-----------------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------------
# Local imports:
from EUVpy.tools.spectralAnalysis import spectralIrradiance
#-----------------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------------
# Global Variable:
# solomonTable = np.array([
# [1, 0.5, 4, 5.010e1, 0, 2.948e2, 5.010e1, 6.240e-1, 3.188e4, 7.847e5],
# [2, 4, 8, 1.0e4, 0, 7.6e3, 1.0e4, 3.710e-1, 3.643e4, 8.968e5],
# [3, 8, 18, 2.0e-6, 0, 4.6e5, 2.0e6, 2.0e-1, 5.485e6, 1.046e8],
# [4, 18, 32, 7.600e6, 7.470e5, 9.220e5, 2.850e7, 6.247e-2, 6.317e6, 9.234e7],
# [5, 32, 70, 1.659e8, 6.623e7, 4.293e6, 5.326e8, 1.343e-2, 3.710e8, 1.475e9],
# [6, 70, 155, 4.012e8, 1.662e8, 5.678e6, 1.270e9, 9.182e-3, 1.023e9, 3.752e9],
# [7, 155, 224, 2.078e9, 1.510e8, 6.273e7, 5.612e9, 1.433e-2, 2.953e9, 1.144e10],
# [8, 224, 290, 1.724e9, 3.310e8, 9.834e7, 4.342e9, 2.575e-2, 4.927e9, 1.436e10],
# [9, 290, 320, 6.793e9, 2.220e9, 4.286e7, 8.380e9, 7.059e-3, 6.942e9, 1.234e10],
# [10, 320, 540, 2.750e9, 5.469e8, 1.080e8, 2.861e9, 1.458e-2, 6.486e9, 1.591e10],
# [11, 540, 650, 5.035e9, 2.969e9, 1.590e7, 4.830e9, 5.857e-3, 3.499e9, 6.213e9],
# [12, 650, 798, 1.562e9, 6.938e8, 8.208e6, 1.459e9, 5.719e-3, 1.869e9, 2.631e9],
# [13, 650, 798, 1.264e9, 6.690e8, 5.445e5, 1.142e9, 3.680e-3, 1.136e9, 1.540e+09],
# [14, 798, 913, 3.011e9, 3.011e9, 0, 2.364e9, 5.310e-3, 3.494e9, 5.868e9],
# [15, 798, 913, 4.661e9, 4.213e9, 0, 3.655e9, 5.261e-3, 5.138e9, 8.562e9],
# [16, 798, 913, 1.020e9, 1.020e9, 0, 8.448e8, 5.437e-3, 1.306e9, 2.157e9],
# [17, 913, 975, 5.441e8, 4.187e8, 0, 3.818e8, 4.915e-3, 8.343e8, 1.373e9],
# [18, 913, 975, 1.483e9, 1.307e9, 0, 1.028e9, 4.955e-3, 1.866e9, 2.862e9],
# [19, 913, 975, 8.642e8, 8.440e8, 0, 7.156e8, 4.422e-3, 6.840e8, 1.111e9],
# [20, 975, 987, 6.056e9, 3.671e9, 0, 4.482e9, 3.950e-3, 4.139e9, 6.801e9],
# [21, 987, 1027, 5.569e9, 4.984e9, 0, 4.419e9, 5.021e-3, 6.274e9, 1.019e10],
# [22, 1027, 1050, 6.309e9, 5.796e9, 0, 4.235e9, 4.825e-3, 4.389e9, 7.153e9]
# ])
solomonTable = np.array([
[1, 0.05, 0.4, 5.010e+01, 0.000e+00, 2.948e+02, 5.010e+01, 6.240e-01],
[2, 0.4, 0.8, 1.000e+04, 0.000e+00, 7.600e+03, 1.000e+04, 3.710e-01],
[3, 0.8, 1.8, 2.000e+06, 0.000e+00, 4.600e+05, 2.000e+06, 2.000e-01],
[4, 1.8, 3.2, 7.600e+06, 7.470e+05, 9.220e+05, 2.850e+07, 6.247e-02],
[5, 3.2, 7.0, 1.659e+08, 6.623e+07, 4.293e+06, 5.326e+08, 1.343e-02],
[6, 7.0, 15.5, 4.012e+08, 1.662e+08, 5.678e+06, 1.270e+09, 9.182e-03],
[7, 15.5, 22.4, 2.078e+09, 1.510e+08, 6.273e+07, 5.612e+09, 1.433e-02],
[8, 22.4, 29.0, 1.724e+09, 3.310e+08, 9.834e+07, 4.342e+09, 2.575e-02],
[9, 29.0, 32.0, 6.793e+09, 2.220e+09, 4.286e+07, 8.380e+09, 7.059e-03],
[10, 32.0, 54.0, 2.750e+09, 5.469e+08, 1.080e+08, 2.861e+09, 1.458e-02],
[11, 54.0, 65.0, 5.035e+09, 2.969e+09, 1.590e+07, 4.830e+09, 5.857e-03],
[12, 65.0, 79.8, 1.562e+09, 6.938e+08, 8.208e+06, 1.459e+09, 5.719e-03],
[13, 65.0, 79.8, 1.264e+09, 6.690e+08, 5.445e+05, 1.142e+09, 3.680e-03],
[14, 79.8, 91.3, 3.011e+09, 3.011e+09, 0.000e+00, 2.364e+09, 5.310e-03],
[15, 79.8, 91.3, 4.661e+09, 4.213e+09, 0.000e+00, 3.655e+09, 5.261e-03],
[16, 79.8, 91.3, 1.020e+09, 1.020e+09, 0.000e+00, 8.448e+08, 5.437e-03],
[17, 91.3, 97.5, 5.441e+08, 4.187e+08, 0.000e+00, 3.818e+08, 4.915e-03],
[18, 91.3, 97.5, 1.483e+09, 1.307e+09, 0.000e+00, 1.028e+09, 4.955e-03],
[19, 91.3, 97.5, 8.642e+08, 8.440e+08, 0.000e+00, 7.156e+08, 4.422e-03 ],
[20, 97.5, 98.7, 6.056e+09, 3.671e+09, 0.000e+00, 4.482e+09, 3.950e-03],
[21, 98.7, 102.7, 5.569e+09, 4.984e+09, 0.000e+00, 4.419e+09, 5.021e-03],
[22, 102.7, 105.0, 6.309e+09, 5.796e+09, 0.000e+00, 4.235e+09, 4.825e-03]
])
solomonBands = {
'short': solomonTable[:, 1]*10,
'long': solomonTable[:, 2]*10
}
solomonBandWidths = np.array([3.5, 0.4, 1., 1.4, 3.8, 8.5, 6.9, 6.6, 3., 22., 11., 14.8, 14.8, 11.5, 11.5, 11.5, 6.2,
6.2, 6.2, 1.2, 4., 2.3 , 16.], dtype=np.float32)/10.
# The tables above are in units of Angstroms - source is Table A1 from Solomon and Qian 2005.
#-----------------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------------
[docs]
def solomon(F107, F107A, model='HFG'):
"""
Compute the solar EUV irradiance in 23 standard bands. Utilizes Equations 1-3 from Solomon and Qian 2005
(doi:10.1029/2005JA011160).
Parameters
----------
F107 : numpy.ndarray
Values of the F10.7 solar flux.
F107A : numpy.ndarray
Values of the 81-day averaged solar flux, centered on the present day.
model : {'HFG', 'EUVAC'}
Controls whether or not the empirical EUV data returned corresponds to the HFG model or the EUVAC model.
Returns
-------
solomonFlux : numpy.ndarray
Values of the solar radiant flux in 23 distinct wavelength bands. Units of photon/m^2/s.
solomonIrr : numpy.ndarray
Values of the solar EUV irradiance in 23 distinct wavelength bands. Units of W/m^2.
"""
# Instantiate the output data:
if type(F107) == list or type(F107) != np.ndarray:
F107 = np.array([F107])
F107A = np.array([F107A])
solomonFlux = np.zeros((1, solomonTable.shape[0]))
solomonIrr = np.zeros((1, solomonTable.shape[0]))
else:
solomonFlux = np.zeros((len(F107), solomonTable.shape[0]))
solomonIrr = np.zeros((len(F107), solomonTable.shape[0]))
# Calculate the model coefficients (for every F107, F107A pair):
r1 = 0.0138*(F107 - 71.5) + 0.005*(F107 - F107A + 3.9)
r2 = 0.5943*(F107 - 71.5) + 0.381*(F107 - F107A + 3.9)
# Compute P:
P = 0.5*(F107 + F107A)
# Loop across every F107, F107A pair:
# for i in range(len(F107)):
# Loop across every bin and fill in the data:
for j in range(solomonIrr.shape[1]):
waves = solomonTable[j, 1]
wavel = solomonTable[j, 2]
# dwav = wavel - waves
mid = 0.5*(waves + wavel)
if model == 'EUVAC':
if j <= 3:
prod = np.abs(1. + solomonTable[j, 7]*(P - 80.))
else:
prod = (1. + solomonTable[j, 7]*(P - 80.))
flux = (solomonTable[j, 6] * prod) * 1.0e4 # convert from ph cm^-2 s^-1 to photon m^-2 s^-1
else:
flux = (solomonTable[j, 3] + r1*solomonTable[j, 4] + r2*solomonTable[j, 5]) * 1.0e4 # Units of photon m^-2 s^-1
irradiance = spectralIrradiance(flux, mid*10)
solomonFlux[:, j] = np.squeeze(flux)
solomonIrr[:, j] = np.squeeze(irradiance)
# mins = [np.nanmin(element) for element in solomonIrr.T]
# np.where(np.asarray(mins) < 0)
# 0, 1, 2, 3, 7 (EUVAC)
# 0, 1, 2, 3, 4, 7, 9 (HFG)
return solomonFlux, solomonIrr
#-----------------------------------------------------------------------------------------------------------------------