14 Anisotropic2::Anisotropic2(Pvl &pvl, PhotoModel &pmodel) : AtmosModel(pvl, pmodel) {
52 double f1munot, f2munot, f3munot;
53 double f1mmunot, f2mmunot, f3mmunot;
55 double f1mu, f2mu, f3mu;
56 double f1mmu, f2mmu, f3mmu;
61 double xmunot_0, ymunot_0;
64 double xmunot_1, ymunot_1;
67 if(p_atmosBha == 0.0) {
71 if(p_atmosTau == 0.0) {
80 if(p_atmosWha == 1.0) {
81 QString msg =
"Anisotropic conservative case not implemented yet - WHA parameter cannot be set to 1.0.";
82 msg +=
"This will cause negative planetary curvature to occur.";
88 p_wha2 = 0.5 * p_atmosWha;
89 p_wham = 1.0 - p_atmosWha;
109 p_f1m = log(2.0) - p_em * p_e1 + p_e1_2;
110 p_f2m = -1.0 * (p_f1m + p_em * p_e2 - 1.0);
111 p_f3m = -1.0 * (p_f2m + p_em * p_e3 - 0.5);
112 p_f4m = -1.0 * (p_f3m + p_em * p_e4 - (1.0 / 3.0));
113 p_g12 = (p_atmosTau * p_e1 * p_e2 + p_f1m + p_f2m) * 0.5;
114 p_g13 = (p_atmosTau * p_e1 * p_e3 + p_f1m + p_f3m) * (1.0 / 3.0);
115 p_g14 = (p_atmosTau * p_e1 * p_e4 + p_f1m + p_f4m) * 0.25;
116 p_g32 = (p_atmosTau * p_e3 * p_e2 + p_f3m + p_f2m) * 0.25;
117 p_g33 = (p_atmosTau * p_e3 * p_e3 + p_f3m + p_f3m) * 0.2;
118 p_g34 = (p_atmosTau * p_e3 * p_e4 + p_f3m * p_f4m) * (1.0 / 6.0);
132 p_f1 = Eulgam() + log(p_atmosTau) + p_e * p_e1;
133 p_f2 = p_f1 + p_e * p_e2 - 1.0;
134 p_f3 = p_f2 + p_e * p_e3 - 0.5;
135 p_f4 = p_f3 + p_e * p_e4 - (1.0 / 3.0);
137 p_g12p = (p_atmosTau * (p_e1 - p_g11p) + p_em * (p_f1 + p_f2)) * 0.25;
138 p_g13p = (p_atmosTau * (0.5 * p_e1 - p_g12p) + p_em * (p_f1 + p_f3)) * 0.2;
139 p_g14p = (p_atmosTau * ((1.0 / 3.0) * p_e1 - p_g13p) + p_em * (p_f1 + p_f4)) * (1.0 / 6.0);
140 p_g32p = (p_atmosTau * (p_e1 - p_g13p) + p_em * (p_f3 + p_f2)) * (1.0 / 6.0);
141 p_g33p = (p_atmosTau * (0.5 * p_e1 - p_g32p) + p_em * (p_f3 + p_f3)) * 0.142857;
142 p_g34p = (p_atmosTau * ((1.0 / 3.0) * p_e1 - p_g33p) + p_em * (p_f3 + p_f4)) * 0.125;
146 p_x0_0 = p_wha2 * (1.0 + (1.0 / 3.0) * p_atmosBha * p_wham + p_wha2 * (p_g12 + p_atmosBha *
147 p_wham * (p_g14 + p_g32) + pow(p_atmosBha, 2.0) * pow(p_wham, 2.0) * p_g34));
148 p_y0_0 = p_wha2 * (p_e2 + p_atmosBha * p_wham * p_e4 + p_wha2 * (p_g12p
149 + p_atmosBha * p_wham * (p_g14p + p_g32p) +
150 pow(p_atmosBha, 2.0) * pow(p_wham, 2.0) * p_g34p));
153 p_delta_0 = (1.0 - (p_x0_0 + p_y0_0) - (1.0 - p_atmosWha * (1.0 + (1.0 / 3.0) * p_atmosBha *
154 p_wham)) / (1.0 - (p_x0_0 - p_y0_0))) / (p_atmosWha * (0.5 - p_e3 + p_atmosBha * p_wham * (0.25 - p_e5)));
157 p_alpha0_0 = 1.0 + p_wha2 * (p_g12 + p_atmosBha * p_wham * p_g32) + p_delta_0 * (0.5 - p_e3);
158 p_alpha1_0 = 0.5 + p_wha2 * (p_g13 + p_atmosBha * p_wham * p_g33) + p_delta_0 * ((1.0 / 3.0) - p_e4);
159 p_beta0_0 = p_e2 + p_wha2 * (p_g12p + p_atmosBha * p_wham * p_g32p) + p_delta_0 * (0.5 - p_e3);
160 p_beta1_0 = p_e3 + p_wha2 * (p_g13p + p_atmosBha * p_wham * p_g33p) + p_delta_0 * ((1.0 / 3.0) - p_e4);
165 p_fac = 2.0 - p_atmosWha * p_alpha0_0;
166 p_den = pow(p_fac, 2.0) - pow((p_atmosWha * p_beta0_0), 2.0);
167 p_q0 = p_atmosBha * p_atmosWha * p_wham * (p_fac * p_alpha1_0 - p_atmosWha * p_beta0_0 * p_beta1_0) / p_den;
168 p_p0 = p_atmosBha * p_atmosWha * p_wham * (-p_fac * p_beta1_0 - p_atmosWha * p_beta0_0 * p_alpha1_0) / p_den;
169 p_q02p02 = p_q0 * p_q0 - p_p0 * p_p0;
170 p_q1 = (2.0 * p_wham * p_fac) / p_den;
171 p_p1 = (2.0 * p_wham * p_atmosWha * p_beta0_0) / p_den;
172 p_q12p12 = p_q1 * p_q1 - p_p1 * p_p1;
175 p_sbar = 1.0 - 2.0 * (p_q1 * p_alpha1_0 + p_p1 * p_beta1_0);
179 p_x0_1 = 0.5 * p_wha2 * p_atmosBha * (1.0 - (1.0 / 3.0) + 0.5 * p_wha2 * p_atmosBha *
180 (p_g12 - (p_g14 + p_g32) + p_g34));
181 p_y0_1 = 0.5 * p_wha2 * p_atmosBha * (p_e2 - p_e4 + 0.5 * p_wha2 * p_atmosBha *
182 (p_g12p - (p_g14p + p_g32p) + p_g34p));
185 p_delta_1 = (1.0 - (p_x0_1 + p_y0_1) - (1.0 - (1.0 / 3.0) * p_atmosWha * p_atmosBha) /
186 (1.0 - (p_x0_1 - p_y0_1))) / (p_wha2 * p_atmosBha *
187 ((0.5 - 0.25) - (p_e3 - p_e5)));
190 SetOldTau(p_atmosTau);
191 SetOldWha(p_atmosWha);
197 if(incidence == 90.0) {
201 munot = cos((
PI / 180.0) * incidence);
204 maxval = max(1.0e-30, hpsq1 + munot * munot);
206 munotp = max(munotp, p_atmosTau / 69.0);
208 if(emission == 90.0) {
212 mu = cos((
PI / 180.0) * emission);
215 maxval = max(1.0e-30, hpsq1 + mu * mu);
217 mup = max(mup, p_atmosTau / 69.0);
220 maxval = max(1.0e-30, munotp);
221 xx = -p_atmosTau / maxval;
229 emunot = exp(-p_atmosTau / munotp);
232 maxval = max(1.0e-30, mup);
233 xx = -p_atmosTau / maxval;
241 emu = exp(-p_atmosTau / mup);
246 if(fabs(xx - 1.0) < 1.0e-10) {
248 f1mmunot = xx * (log(1.0 + 1.0 / xx) - p_e1 * emunot +
252 f1munot = xx * (log(xx / (1.0 - xx)) + p_e1 / emunot +
254 f1mmunot = xx * (log(1.0 + 1.0 / xx) - p_e1 * emunot +
258 QString msg =
"Negative length of planetary curvature encountered";
262 f2munot = munotp * (f1munot + p_e2 / emunot - 1);
263 f2mmunot = -munotp * (f1mmunot + p_e2 * emunot - 1);
264 f3munot = munotp * (f2munot + p_e3 / emunot - 0.5);
265 f3mmunot = -munotp * (f2mmunot + p_e3 * emunot - 0.5);
268 if(fabs(xx - 1.0) < 1.0e-10) {
270 f1mmu = xx * (log(1.0 + 1.0 / xx) - p_e1 * emu +
AtmosModel::En(1, p_atmosTau * (1.0 + 1.0 / xx)));
273 f1mu = xx * (log(xx / (1.0 - xx)) + p_e1 / emu +
AtmosModel::Ei(p_atmosTau * (1.0 / xx - 1.0)));
274 f1mmu = xx * (log(1.0 + 1.0 / xx) - p_e1 * emu +
AtmosModel::En(1, p_atmosTau * (1.0 + 1.0 / xx)));
277 QString msg =
"Negative length of planetary curvature encountered";
281 f2mu = mup * (f1mu + p_e2 / emu - 1);
282 f2mmu = -mup * (f1mmu + p_e2 * emu - 1);
283 f3mu = mup * (f2mu + p_e3 / emu - 0.5);
284 f3mmu = -mup * (f2mmu + p_e3 * emu - 0.5);
287 xmunot_0 = 1.0 + p_wha2 * (f1mmunot + p_atmosBha * p_wham * f3mmunot) + p_delta_0 * munotp * (1.0 - emunot);
288 ymunot_0 = emunot * (1.0 + p_wha2 * (f1munot + p_atmosBha * p_wham * f3munot)) +
289 p_delta_0 * munotp * (1.0 - emunot);
290 xmu_0 = 1.0 + p_wha2 * (f1mmu + p_atmosBha * p_wham * f3mmu) + p_delta_0 * mup * (1.0 - emu);
291 ymu_0 = emu * (1.0 + p_wha2 * (f1mu + p_atmosBha * p_wham * f3mu)) + p_delta_0 * mup * (1.0 - emu);
294 xmunot_1 = 1.0 + 0.5 * p_wha2 * p_atmosBha * (f1mmunot - f3mmunot) + p_delta_1 * munotp * (1.0 - emunot);
295 ymunot_1 = emunot * (1.0 + 0.5 * p_wha2 * p_atmosBha *
296 (f1munot - f3munot)) + p_delta_1 * munotp * (1.0 - emunot);
297 xmu_1 = 1.0 + 0.5 * p_wha2 * p_atmosBha * (f1mmu - f3mmu) + p_delta_1 * mup * (1.0 - emu);
298 ymu_1 = emu * (1.0 + 0.5 * p_wha2 * p_atmosBha * (f1mu - f3mu)) + p_delta_1 * mup * (1.0 - emu);
301 gmunot = p_p1 * xmunot_0 + p_q1 * ymunot_0;
302 gmu = p_p1 * xmu_0 + p_q1 * ymu_0;
307 cxx = 1.0 - p_q0 * sum + (p_q02p02 - p_atmosBha * p_q12p12) * prod;
308 cyy = 1.0 + p_q0 * sum + (p_q02p02 - p_atmosBha * p_q12p12) * prod;
311 cosazss = 0.0 - munot * mu;
314 cosazss = cos((
PI / 180.0) * phase) - munot * mu;
317 xystuff = cxx * xmunot_0 * xmu_0 - cyy * ymunot_0 *
318 ymu_0 - p_p0 * sum * (xmu_0 * ymunot_0 + ymu_0 * xmunot_0) + cosazss * p_atmosBha * (xmu_1 *
319 xmunot_1 - ymu_1 * ymunot_1);
320 p_pstd = 0.25 * p_atmosWha * munotp / (munotp + mup) * xystuff;