10 Anisotropic1::Anisotropic1(Pvl &pvl, PhotoModel &pmodel) : AtmosModel(pvl, pmodel) {
13 p_atmosAlpha0_0 = 0.0;
14 p_atmosAlpha1_0 = 0.0;
76 double xmunot_0, ymunot_0;
78 double xmunot_1, ymunot_1;
83 if(p_atmosBha == 0.0) {
87 if(p_atmosTau == 0.0) {
96 if(p_atmosWha == 1.0) {
97 QString msg =
"Anisotropic conservative case not implemented yet - WHA parameter cannot be set to 1.0";
98 msg +=
"This will cause negative planetary curvature to occur.";
104 p_atmosWha2 = 0.5 * p_atmosWha;
105 p_atmosWham = 1.0 - p_atmosWha;
112 p_atmosX0_0 = p_atmosWha2 * (1.0 + (1.0 / 3.0) * p_atmosBha *
114 p_atmosY0_0 = p_atmosWha2 * (p_atmosE2 + p_atmosBha * p_atmosWham *
117 p_atmosDelta_0 = (1.0 - (p_atmosX0_0 + p_atmosY0_0) - (1.0 - p_atmosWha *
118 (1.0 + (1.0 / 3.0) * p_atmosBha * p_atmosWham)) / (1.0 -
119 (p_atmosX0_0 - p_atmosY0_0))) / (p_atmosWha * (0.5 - p_atmosE3 +
120 p_atmosBha * p_atmosWham * (0.25 - p_atmosE5)));
123 p_atmosAlpha0_0 = 1.0 + p_atmosDelta_0 * (0.5 - p_atmosE3);
124 p_atmosAlpha1_0 = 0.5 + p_atmosDelta_0 * ((1.0 / 3.0) - p_atmosE4);
125 p_atmosBeta0_0 = p_atmosE2 + p_atmosDelta_0 * (0.5 - p_atmosE3);
126 p_atmosBeta1_0 = p_atmosE3 + p_atmosDelta_0 * ((1.0 / 3.0) - p_atmosE4);
130 p_atmosFac = 2.0 - p_atmosWha * p_atmosAlpha0_0;
131 p_atmosDen = pow(p_atmosFac, 2.0) - pow(p_atmosWha * p_atmosBeta0_0, 2.0);
132 p_atmosQ0 = p_atmosBha * p_atmosWha * p_atmosWham * (p_atmosFac *
133 p_atmosAlpha1_0 - p_atmosWha * p_atmosBeta0_0 * p_atmosBeta1_0) /
135 p_atmosP0 = p_atmosBha * p_atmosWha * p_atmosWham * (-p_atmosFac *
136 p_atmosBeta1_0 - p_atmosWha * p_atmosBeta0_0 * p_atmosAlpha1_0) /
138 p_atmosQ02p02 = p_atmosQ0 * p_atmosQ0 - p_atmosP0 * p_atmosP0;
139 p_atmosQ1 = (2.0 * p_atmosWham * p_atmosFac) / p_atmosDen;
140 p_atmosP1 = (2.0 * p_atmosWham * p_atmosWha * p_atmosBeta0_0) /
142 p_atmosQ12p12 = p_atmosQ1 * p_atmosQ1 - p_atmosP1 * p_atmosP1;
144 p_sbar = 1.0 - 2.0 * (p_atmosQ1 * p_atmosAlpha1_0 + p_atmosP1 *
148 p_atmosX0_1 = 0.5 * p_atmosWha2 * p_atmosBha * (1.0 - (1.0 / 3.0));
149 p_atmosY0_1 = 0.5 * p_atmosWha2 * p_atmosBha * (p_atmosE2 - p_atmosE4);
151 p_atmosDelta_1 = (1.0 - (p_atmosX0_1 + p_atmosY0_1) - (1.0 -
152 (1.0 / 3.0) * p_atmosWha * p_atmosBha) / (1.0 - (p_atmosX0_1 -
153 p_atmosY0_1))) / (p_atmosWha2 * p_atmosBha * ((0.5 - 0.25) -
154 (p_atmosE3 - p_atmosE5)));
156 SetOldTau(p_atmosTau);
157 SetOldWha(p_atmosWha);
163 if(incidence == 90.0) {
167 munot = cos((
PI / 180.0) * incidence);
170 maxval = max(1.0e-30, hpsq1 + munot * munot);
172 munotp = max(munotp, p_atmosTau / 69.0);
173 if(emission == 90.0) {
177 mu = cos((
PI / 180.0) * emission);
180 maxval = max(1.0e-30, hpsq1 + mu * mu);
182 mup = max(mup, p_atmosTau / 69.0);
184 maxval = max(1.0e-30, munotp);
185 xx = -p_atmosTau / maxval;
194 emunot = exp(-p_atmosTau / munotp);
197 maxval = max(1.0e-30, mup);
198 xx = -p_atmosTau / maxval;
207 emu = exp(-p_atmosTau / mup);
211 xmunot_0 = 1.0 + p_atmosDelta_0 * munotp * (1.0 - emunot);
212 ymunot_0 = emunot + p_atmosDelta_0 * munotp * (1.0 - emunot);
213 xmu_0 = 1.0 + p_atmosDelta_0 * mup * (1.0 - emu);
214 ymu_0 = emu + p_atmosDelta_0 * mup * (1.0 - emu);
217 xmunot_1 = 1.0 + p_atmosDelta_1 * munotp * (1.0 - emunot);
218 ymunot_1 = emunot + p_atmosDelta_1 * munotp * (1.0 - emunot);
219 xmu_1 = 1.0 + p_atmosDelta_1 * mup * (1.0 - emu);
220 ymu_1 = emu + p_atmosDelta_1 * mup * (1.0 - emu);
223 gmunot = p_atmosP1 * xmunot_0 + p_atmosQ1 * ymunot_0;
224 gmu = p_atmosP1 * xmu_0 + p_atmosQ1 * ymu_0;
229 cxx = 1.0 - p_atmosQ0 * sum + (p_atmosQ02p02 - p_atmosBha *
230 p_atmosQ12p12) * prod;
231 cyy = 1.0 + p_atmosQ0 * sum + (p_atmosQ02p02 - p_atmosBha *
232 p_atmosQ12p12) * prod;
235 cosazss = 0.0 - munot * mu;
238 cosazss = cos((
PI / 180.0) * phase) - munot * mu;
241 xystuff = cxx * xmunot_0 * xmu_0 - cyy * ymunot_0 *
242 ymu_0 - p_atmosP0 * sum * (xmu_0 * ymunot_0 + ymu_0 *
243 xmunot_0) + cosazss * p_atmosBha * (xmu_1 *
244 xmunot_1 - ymu_1 * ymunot_1);
245 p_pstd = 0.25 * p_atmosWha * munotp / (munotp + mup) * xystuff;
double p_atmosHnorm
Atmospheric shell thickness normalized to planet radius.
double p_trans0
Transmission of surface reflected light through the atmosphere with no scatterings in the atmosphere...
const double PI(3.14159265358979323846)
The mathematical constant PI.
double p_trans
Transmission of surface reflected light through the atmosphere overall.
Isotropic atmos scattering model.
double p_sbar
Illumination of the ground by the sky.
static double En(unsigned int n, double x)
This routine evaluates the generalized exponential integral, En(x).
virtual void AtmosModelAlgorithm(double phase, double incidence, double emission)
Anisotropic atmospheric scattering with P1 single-particle phase fn, in the second approximation...
#define _FILEINFO_
Macro for the filename and line number.
A type of error that could only have occurred due to a mistake on the user's part (e...
Container for cube-like labels.
double p_transs
Transmission of light that must be subtracted from the flat surface model to get the shadow model...
double p_pstd
Pure atmospheric-scattering term.
bool TauOrWhaChanged() const
Checks whether tau or wha have changed.