8 #include "MoonAlbedo.h"
9 #include "SpecialPixel.h"
10 #include "IException.h"
12 #define MIN(x,y) (((x) < (y)) ? (x) : (y))
13 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
16 MoonAlbedo::MoonAlbedo(Pvl &pvl, PhotoModel &pmodel) :
17 NormModel(pvl, pmodel) {
18 PvlGroup &algo = pvl.findObject(
"NormalizationModel")
26 SetNormWl(p_normWavelength);
33 if(algo.hasKeyword(
"D")) {
37 if(algo.hasKeyword(
"Wl")) {
38 SetNormWl(algo[
"Wl"]);
41 if(algo.hasKeyword(
"E")) {
46 p_normE = -0.3575 * p_normWl - 0.0607;
53 if(algo.hasKeyword(
"F")) {
57 if(algo.hasKeyword(
"G2")) {
58 SetNormG2(algo[
"G2"]);
62 p_normG2 = -0.9585 * p_normWl + 0.98;
69 if(algo.hasKeyword(
"Xmul")) {
70 SetNormXmul(algo[
"Xmul"]);
73 if(algo.hasKeyword(
"H")) {
77 if(algo.hasKeyword(
"Bsh1")) {
78 SetNormBsh1(algo[
"Bsh1"]);
81 p_normBsh1 = 19.89 - 59.58 * p_normWl + 59.86 * pow(p_normWl, 2) -
82 20.09 * pow(p_normWl, 3);
83 if(p_normBsh1 < 0.0) {
88 if(algo.hasKeyword(
"Xb1")) {
89 SetNormXb1(algo[
"Xb1"]);
92 if(algo.hasKeyword(
"Xb2")) {
93 SetNormXb2(algo[
"Xb2"]);
98 p_normF1 = 1.0 - p_normF;
99 double g1 = p_normD * 0.1 + p_normE;
100 double g1sq = g1 * g1;
101 p_normG2sq = p_normG2 * p_normG2;
102 double c30 = cos(30.0 *
Isis::PI / 180.0);
103 if(1.0 + g1sq + 2.0 * g1 *c30 <= 0.0) {
104 std::string msg =
"Error while initializing Buratti function";
107 double pg130 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * c30), 1.5));
108 if(1.0 + p_normG2sq + 2.0 * p_normG2 *c30 <= 0.0) {
109 std::string msg =
"Error while initializing Buratti function";
112 double pg230 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * c30), 1.5));
113 if(p_normBsh1 < 0.0) p_normBsh1 = 0.0;
114 if(1.0 + tan(15.0 *
Isis::PI / 180.0) / p_normH == 0.0) {
115 std::string msg =
"Error while initializing Buratti function";
118 double bshad30 = 1.0 + p_normBsh1 / (1.0 + tan(15.0 *
Isis::PI / 180.0) / p_normH);
119 p_normPg30 = (pg130 + pg230) * bshad30;
120 p_normBc1 = p_normXb1 + p_normXb2 * p_normWl;
121 p_normFbc3 = 1.0 + p_normBc1 * 2.0;
122 if(p_normFbc3 == 0.0) {
123 std::string msg =
"Error while initializing Buratti function";
126 p_normC3 = cos(2.0 *
Isis::PI / 180.0);
127 if(1.0 + p_normG2sq + 2.0 * p_normG2 *p_normC3 <= 0.0) {
128 std::string msg =
"Error while initializing Buratti function";
131 p_normPg32 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * p_normC3), 1.5));
132 if(1.0 + tan(
Isis::PI / 180.0) / p_normH == 0.0) {
133 std::string msg =
"Error while initializing Buratti function";
136 p_normBshad3 = 1.0 + p_normBsh1 / (1.0 + tan(
Isis::PI / 180.0) / p_normH);
139 void MoonAlbedo::NormModelAlgorithm(
double phase,
double incidence,
double emission,
140 double demincidence,
double dememission,
double dn,
141 double &albedo,
double &mult,
double &base) {
155 a = GetPhotoModel()->
CalcSurfAlbedo(phase, demincidence, dememission);
158 cosa = cos(phase *
Isis::PI / 180.0);
159 if(1.0 + p_normG2sq + 2.0 * p_normG2 *cosa <= 0.0) {
163 pg2 = p_normF * (1.0 - p_normG2sq) / (pow((1.0 + p_normG2sq + 2.0 * p_normG2 * cosa), 1.5));
164 if(1.0 + tan(phase * .5 *
Isis::PI / 180.0) / p_normH == 0.0) {
168 bshad = 1.0 + p_normBsh1 / (1.0 + tan(phase * .5 *
Isis::PI / 180.0) / p_normH);
172 for(
int i = 0; i < 6; i++) {
173 g1 = p_normD * albedo + p_normE;
175 if(1.0 + g1sq + 2.0 * g1 *cosa <= 0.0) {
179 pg1 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * cosa), 1.5));
180 pg = (pg1 + pg2) * bshad;
182 fbc = 1.0 + p_normBc1 * phase;
183 if(1.0 + g1sq + 2.0 * g1 *p_normC3 <= 0.0) {
187 pg31 = p_normF1 * (1.0 - g1sq) / (pow((1.0 + g1sq + 2.0 * g1 * p_normC3), 1.5));
188 pg3 = (pg31 + p_normPg32) * p_normBshad3;
189 pg = fbc * (pg3 / p_normFbc3);
195 albedo = r * a * p_normPg30 / pg;
280 std::string msg =
"Invalid value of normalization h [" +
297 std::string msg =
"Invalid value of normalization bsh1 [" +